![](https://cdn.jsdelivr.net/gh/xiaok0707/MyPhotos@master/img/20200805163537.png)
模拟
手动模拟加法的过程,用一个变量 flag
作为进位标志,从左向右同时遍历两个链表,将对应位置上的数相加得到当前位的结果,同时更新进位标志 flag
,继续完成后续计算.
需要注意的是两个链表长度不相等的情况,以及如果在计算完毕时 flag=1
,那么还需要在结果链表尾部附加一个新结点表示进位得到的最高位的 1·
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *p1=l1,*p2=l2,*head,*pre,*cur;
int flag=0;
pre=new ListNode(0);
head=pre;
while(p1 && p2){
int x=(p1->val)+(p2->val)+flag;
flag=x/10;
cur=new ListNode(x%10);
pre->next=cur;
pre=cur;
p1=p1->next;
p2=p2->next;
}
while(p1){
int x=(p1->val)+flag;
flag=x/10;
cur=new ListNode(x%10);
pre->next=cur;
pre=cur;
p1=p1->next;
}
while(p2){
int x=(p2->val)+flag;
flag=x/10;
cur=new ListNode(x%10);
pre->next=cur;
pre=cur;
p2=p2->next;
}
if(flag){
cur=new ListNode(flag);
pre->next=cur;
}
return head->next;
}
};
个人 LeetCode 代码仓库地址:MyLeetCode,记录刷题成长之路,欢迎各位小伙伴们多多 star ~