1. 程式人生 > 實用技巧 >LeetCode445 兩數相加2

LeetCode445 兩數相加2

給你兩個 非空 連結串列來代表兩個非負整數。數字最高位位於連結串列開始位置。它們的每個節點只儲存一位數字。將這兩數相加會返回一個新的連結串列。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

進階:

如果輸入連結串列不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。

逆序處理首先應該想到棧,而不是遞迴,因為棧更方便,消耗空間也更少。

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 12 stack<ListNode*>s1,s2; 13 while(l1!=nullptr){ 14 s1.push(l1); 15 l1=l1->next; 16 } 17 while(l2!=nullptr){ 18 s2.push(l2);
19 l2=l2->next; 20 } 21 int carry=0; 22 ListNode* nextptr=nullptr; 23 while(!s1.empty() || !s2.empty()){ 24 int n1=s1.empty()?0:s1.top()->val; 25 int n2=s2.empty()?0:s2.top()->val; 26 if(!s1.empty()) s1.pop(); 27 if
(!s2.empty()) s2.pop(); 28 int sum=carry+n1+n2; 29 if(sum>9) carry=1; 30 else carry=0; 31 sum%=10; 32 ListNode* temp=new ListNode(sum); 33 temp->next=nextptr; 34 nextptr=temp; 35 } 36 if(carry){ 37 ListNode* newhaed=new ListNode(1); 38 newhaed->next=nextptr; 39 return newhaed; 40 } 41 return nextptr; 42 43 } 44 };