【LeetCode训练营02】两个非空链表相加 详解

简介: 【LeetCode训练营02】两个非空链表相加 详解

题目


给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。


请你将两个数相加,并以相同形式返回一个表示和的链表。


你可以假设除了数字 0 之外,这两个数都不会以 0 开头。


示例 1:


702380bb3c9a907f1db7a0c123596ae0_75e4df9202e1468757176dc8a1852f12.jpeg


输入:l1 = [2,4,3], l2 = [5,6,4]

输出:[7,0,8]

解释:342 + 465 = 807.

示例 2:


输入:l1 = [0], l2 = [0]

输出:[0]

示例 3:


输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]

输出:[8,9,9,9,0,0,0,1]

提示:


每个链表中的节点数在范围 [1, 100] 内

0 <= Node.val <= 9

题目数据保证列表表示的数字不含前导零


解题思路的分享


题目的要求是对两个链表求和,并且返回作为结果的链表。

我第一时间想到的是对l1进行运算并且返回它,但是这个想法很快就被我推翻了。

如果使用l1作为运算对象,那么当逢十进一时l1下一个结点的值就会被修改,这样肯定是不行的。

所以我们单独定义出一个单链表,对这个单链表进行运算。

单链表就要有头指针和尾指针。

我们还要定义一个sum来存放本位的运算结果,再来一个cf来存放进位的运算结果。

对sum的运算要分三种情况,平常情况(l1和l2都未走到空结点的时候),l1走到空结点时,l2走到空结点时。

要想将每一位的运算结果存起来,就要开辟新的结点。

sum%10就是这个结点的值,cf/10是进位的值,要保存下来用于下一次运算。

结点的插入类似于单链表的尾插,也是分两种情况,在这里就不多说了。

最后还有一种情况是l1和l2都已经走到空结点,但是cf还不为零,这是就要创建一个新的结点来存放这个值并作为尾结点。


解题源码的分享


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
   struct ListNode*head=NULL;
   struct ListNode*tail=NULL;
   int sum=0;
   int cf=0;
   while(l1!=NULL||l2!=NULL)
   {
       if(l1==NULL)
       {
           sum=l2->val+cf;
           l2=l2->next;
       }
       else if(l2==NULL)
       {
           sum=l1->val+cf;
           l1=l1->next;
       }
       else{
           sum=l1->val+l2->val+cf;
           l1=l1->next;
           l2=l2->next;
       }
   struct ListNode*sb=(struct ListNode*)malloc(sizeof(struct ListNode));
   sb->val=sum%10;
   sb->next=NULL;
   cf=sum/10;
   if(head==NULL)
   {
       head=sb;
       tail=sb;
   }
   else{
       tail->next=sb;
       tail=sb;
   }
   if(l1==NULL&&l2==NULL&&cf!=0)
   {
       struct ListNode*sb=(struct ListNode*)malloc(sizeof(struct ListNode));
       sb->val=cf;
       sb->next=NULL;
       tail->next=sb;
       tail=sb;
   }
   }
   return head;
}


这个方法可能有些复杂和冗余,有哪里可以改进的地方还请大佬们不吝赐教。

2e1e04d5dab2afd450abe51b975964be_35e119c342ee4cc29ee292d4bbabb3ea.jpeg


相关文章
|
1月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
35 1
|
1月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
48 0
Leetcode第21题(合并两个有序链表)
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
17 0
LeetCode第二十四题(两两交换链表中的节点)
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
40 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
1月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
77 0
|
1月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
21 0
|
1月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
16 0
|
1月前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
12 0
|
1月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
29 0
|
3月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点