劍指 Offer II 025. 連結串列中的兩數相加
阿新 • • 發佈:2022-04-10
給定兩個 非空連結串列 l1和 l2 來代表兩個非負整數。數字最高位位於連結串列開始位置。它們的每個節點只儲存一位數字。將這兩數相加會返回一個新的連結串列。
可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
示例1:
輸入:l1 = [7,2,4,3], l2 = [5,6,4]
輸出:[7,8,0,7]
示例2:
輸入:l1 = [2,4,3], l2 = [5,6,4]
輸出:[8,0,7]
示例3:
輸入:l1 = [0], l2 = [0]
輸出:[0]
提示:
連結串列的長度範圍為 [1, 100]
0 <= node.val <= 9
輸入資料保證連結串列代表的數字無前導 0
進階:如果輸入連結串列不能修改該如何處理?換句話說,不能對列表中的節點進行翻轉。
解析:
不進行翻轉,就用個stack
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { stack<int> a, b; ListNode* p = l1, *q = l2; ListNode* ret = nullptr; while(p) { a.push(p->val); p = p->next; } while(q) { b.push(q->val); q = q->next; } int d = 0; while(!a.empty() && !b.empty()) { d = a.top() + b.top() + d; a.pop(); b.pop(); ListNode* temp = new ListNode(d % 10); temp->next = ret; ret = temp; d /= 10; } while(!a.empty()) { d = a.top() + d; a.pop(); ListNode* temp = new ListNode(d % 10); temp->next = ret; ret = temp; d /= 10; } while(!b.empty()) { d = b.top() + d; b.pop(); ListNode* temp = new ListNode(d % 10); temp->next = ret; ret = temp; d /= 10; } if(d != 0) { ListNode* temp = new ListNode(d); temp->next = ret; ret = temp; d /= 10; } return ret; } };