实现思路
一、遍历两个链表,使用一个sum来记录进位的情况
新节点t
t->val=(l1->val+l2->val+sum)%10
新计算的sum
(l1->val+l2->val+sum)/10
二、当同时遍历完之后,有一个链表不为空时,将该链表和进位进行运算依次得到新节点
三、在之前两步操作之后判断进位是否为1,如果为1,新创建一个节点值为1添加到新链表的最后
实现代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *pre,*head;
int flag=0,sum=0;
while(l1!=nullptr&&l2!=nullptr){
ListNode *t=new ListNode();
t->val=(l1->val+l2->val+sum)%10;
sum=(l1->val+l2->val+sum)/10;
if(!flag){
head=t;
flag=1;
}
else
pre->next=t;
pre=t;
l1=l1->next;
l2=l2->next;
}
while(l1!=nullptr){
ListNode *t=new ListNode();
t->val=(l1->val+sum)%10;
sum=(l1->val+sum)/10;
pre->next=t;
pre=t;
l1=l1->next;
}
while(l2!=nullptr){
ListNode *t=new ListNode();
t->val=(l2->val+sum)%10;
sum=(l2->val+sum)/10;
pre->next=t;
pre=t;
l2=l2->next;
}
if(sum){
ListNode *t=new ListNode(1,nullptr);
pre->next=t;
}
return head;
}
};
提交结果及分析
总结
思想是相同的,不同点在于头结点的处理,第二个的相当于是多设置了一个哨兵节点,这样的好处在于接下来的操作便于一致化处理,否则需要像我第一个代码需要额外有个flag来处理,而且第二个的代码更加简洁,减少了不必要的代码冗余