Leetcode2.兩數相加、Leetcode445.兩數相加||
阿新 • • 發佈:2019-02-18
給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807
模擬全加過程,唯一要注意的是不要忽略最後有進位的情況。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode(0); ListNode p = l1, q = l2, curr = dummyHead; int carry = 0; while (p != null || q != null) { int x = (p != null) ? p.val : 0; int y = (q != null) ? q.val : 0; int sum = carry + x + y; carry = sum / 10; curr.next = new ListNode(sum % 10); curr = curr.next; if (p != null) p = p.next; if (q != null) q = q.next; } if (carry > 0) { curr.next = new ListNode(carry); } return dummyHead.next; }
給定兩個非空連結串列來代表兩個非負整數。數字最高位位於連結串列開始位置。它們的每個節點只儲存單個數字。將這兩數相加會返回一個新的連結串列。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
進階:
如果輸入連結串列不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。
示例:
輸入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出: 7 -> 8 -> 0 -> 7
考慮到進階要求,不能反轉連結串列,那麼只能藉助棧(或陣列)。由於返回的連結串列是從高位起的,那麼在形成連結串列的時候適合用頭插法,而不必最後再反轉連結串列。
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { stack<int> s1, s2; while(l1) { s1.push(l1->val); l1 = l1->next; } while(l2) { s2.push(l2->val); l2 = l2->next; } ListNode* dummy = new ListNode(INT_MAX); ListNode* p = dummy; int carry = 0, curSum = 0; while(s1.size() || s2.size()) { curSum = carry; if(s1.size()) { curSum += s1.top(); s1.pop(); } if(s2.size()) { curSum += s2.top(); s2.pop(); } carry = curSum > 9? 1: 0; curSum %= 10; ListNode* temp = new ListNode(curSum); temp->next = dummy->next; dummy->next = temp; } if(carry) { ListNode* temp = new ListNode(1); temp->next = dummy->next; dummy->next = temp; } return dummy->next; }