【LeetCode训练营02】两个非空链表相加 详解
题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入: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; }
这个方法可能有些复杂和冗余,有哪里可以改进的地方还请大佬们不吝赐教。
下一篇:
Python代码实现快速排序