Leetcode ---- 445.兩數相加II
阿新 • • 發佈:2018-11-29
題目:
給定兩個非空連結串列來代表兩個非負整數。數字最高位位於連結串列開始位置。它們的每個節點只儲存單個數字。將這兩數相加會返回一個新的連結串列。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
進階:
如果輸入連結串列不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。
示例:
輸入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出: 7 -> 8 -> 0 -> 7
思路:
這是一個簡單的兩數相加問題,然而,每一位數字變成用連結串列連結起來增加了一定難度。
做加法很容易想到進位問題,例如999+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) { stack<ListNode*> s1,s2; ListNode *bak; bak=l1; while(bak!=NULL) { s1.push(bak); bak=bak->next; } bak=l2; while(bak!=NULL) { s2.push(bak); bak=bak->next; } ListNode *head; head = NULL; int c = 0; while (!s1.empty() || !s2.empty() || c != 0) { int a = (s1.empty()==false) ? (*(s1.top())).val : 0; int b = (s2.empty()==false) ? (*(s2.top())).val : 0; int sum=a+b+c; if(!s1.empty()) s1.pop(); if(!s2.empty()) s2.pop(); c = sum/10; sum = sum%10; ListNode *node = new ListNode(sum); if(head == NULL) head = node; else { bak = head; head = node; head->next = bak; } } return head; /* stack<int> stk1,stk2; ListNode *res = new ListNode(0); ListNode *cur = res; while (l1){ stk1.push(l1->val); l1 = l1->next; } while (l2){ stk2.push(l2->val); l2 = l2->next; } int cf = 0,num = 0; while (stk1.size() || stk2.size()){ if (stk1.size()){ num += stk1.top(); stk1.pop(); } if (stk2.size()){ num += stk2.top(); stk2.pop(); } ListNode *tmp = new ListNode(num%10); num = num/10; tmp->next = cur->next; cur->next = tmp; } if (num > 0){ ListNode *tmp = new ListNode(1); tmp->next = cur->next; cur->next = tmp; } return res->next;*/ } };