給出兩個 非空 的鏈表用來表示兩個非負的整數(shù)。其中,它們各自的位數(shù)是按照 逆序 的方式存儲的票腰,并且它們的每個節(jié)點只能存儲 一位 數(shù)字。
如果女气,我們將這兩個數(shù)相加起來杏慰,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數(shù)字 0 之外炼鞠,這兩個數(shù)都不會以 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) {
ListNode* Ret=nullptr,*current; // Ret 是新鏈表的頭指針,current為新鏈表的動態(tài)指針
int sum, num=0; // sum為兩數(shù)之和簇搅,num為進位
while(l1&&l2){
sum = l1->val+l2->val+num; // 兩數(shù)相加加進位完域,進位初始化為0
ListNode *node = new ListNode(sum%10); // 新建節(jié)點,初始化的值為余數(shù)
num = sum/10; // 計算進位
Ret?current->next=node:Ret=node; // Ret指針初始化為空瘩将,第一次將Ret 指向新建立的鏈表吟税,后續(xù)是新建節(jié)點接在鏈表后面
current = node; // 新鏈表的動態(tài)移動到新建立的節(jié)點
l1=l1->next; // 原有鏈表的指針移動
l2=l2->next;
} // 計算等長部分;
if(l2) // 不等長部分姿现;統(tǒng)一到l1指針
l1=l2;
while(l1){ // 計算方法類似
sum = l1->val+num;
ListNode *node =new ListNode(sum%10);
num = sum/10;
current->next = node;
current = node;
l1=l1->next;
}
if(num){
ListNode* node = new ListNode(num);
current->next =node;
} // 最后可能還有進位
return Ret; // 返回新鏈表的頭指針
}
};