题目描述:
给出两个非空的链表用来表示两个非负的整数。其中它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字0之外这两个数都不会以0开头。
样例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
/**
* 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) {
if(nullptr==l1){ //如果有一个链表为空,直接返回另一个
return l2;
}
if(nullptr==l2){
return l1;
}
ListNode* head=nullptr;//用来保存加起来的第一个结点
ListNode* tmp=head;//用tmp来更新下一个结点
int step=0;//表示进位
while(l1!=nullptr||l2!=nullptr){
int sum=0;//每次加完都要更新sum
sum+=step;//先加进位
if(l1!=nullptr){
sum+=l1->val;
l1=l1->next;
}
if(l2!=nullptr){
sum+=l2->val;
l2=l2->next;
}
if(sum>9){//大于9表示有进位
sum-=10;
step=1;
}
else{
step=0;//更新step
}
ListNode* cur=new ListNode(sum);
if(head==nullptr){
head=cur; //将第一个结点保存起来
tmp=head;
}
else{
tmp->next=cur;
tmp=cur;
}
}
if(step>0){//如果最后两个相加有进位
ListNode* cur=new ListNode(1);
tmp->next=cur;
}
return head;
}
};