2. 兩數相加--類似兩條連結串列的合併
阿新 • • 發佈:2018-11-28
題目描述:
給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。
你可以假設除了數字 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) {
int carry=0;
ListNode *ans,*q,*p;
if(l1==NULL){ //如果l1為空,那麼直接返回l2。
return l2;
}
else if(l2==NULL){ //如果l2為空,那麼直接返回l1.
return l1;
}
else { //如果l1和l2都不空,因為該題目中的連結串列都沒有頭節點,因此先要處理第一個結點
carry+=l1->val+l2->val;
ans=new ListNode(carry%10); //為第一個結點分配空間,並計算結點值
carry/=10;
l1=l1->next; //l1和l2指標分別後移一個位置
l2=l2->next;
q=ans; //q始終指向結果連結串列中的最後一個結點
}
while(l1!=NULL&&l2!=NULL){ //對兩條連結串列的後面部分進行處理
carry+=l1->val+l2->val;
p=new ListNode(carry%10);
carry/=10;
q->next=p;
q=p;
l1=l1->next;
l2=l2->next;
}
while(l1!=NULL){ //如果最後l1還有剩餘結點,那麼直接處理
carry+=l1->val;
p=new ListNode(carry%10);
carry/=10;
q->next=p;
q=p;
l1=l1->next;
}
while(l2!=NULL){ //如果最後l2還有剩餘結點,那麼直接處理
carry+=l2->val;
p=new ListNode(carry%10);
carry/=10;
q->next=p;
q=p;
l2=l2->next;
}
while(carry!=0){ //最後的carry可能會大於10,因此進行特殊處理
p=new ListNode(carry%10);
carry/=10;
q->next=p;
q=p;
}
return ans;
}
};