1. 程式人生 > 其它 >劍指 Offer II 025. 連結串列中的兩數相加

劍指 Offer II 025. 連結串列中的兩數相加

給定兩個 非空連結串列 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; } };