---
# System prepended metadata

title: 'LeetCode #445 [Add Two Numbers II](https://leetcode.com/problems/add-two-numbers-ii/)'
tags: [LeetCode, Medium, Linked List, Stack]

---

###### tags: `LeetCode` `Linked List` `Medium` `Stack`
# LeetCode #445 [Add Two Numbers II](https://leetcode.com/problems/add-two-numbers-ii/)
### (Medium)

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

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

---
使用vector:將兩個ListNode的值分別存入vector中, 然後將數組反轉, 之後讀取兩數組中的元素並相加, 若數組元素不存在(一開始的兩個ListNode長度不見得一樣)則為0, 並將和存入另一個數組中。

完成後再將數組反轉, 並從頭開始建立回傳用的ListNode。

記得進位。
```
/**
 * 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) {
        vector<int> v1, v2;
        while(l1){
            v1.push_back(l1->val);
            l1=l1->next;
        }
        while(l2){
            v2.push_back(l2->val);
            l2=l2->next;
        }
        reverse(v1.begin(), v1.end());
        reverse(v2.begin(), v2.end());
        int c = 0;
        int i1=v1.size(), i2=v2.size();
        vector<int> v3(max(i1,i2));
        for(int i=0;i<v3.size();i++){
            int n = (i>=i1?0:v1[i]) + (i>=i2?0:v2[i]) + c;
            c = n>=10;
            v3[i]= n%10;
        }
        if(c==1)v3.push_back(1);
        reverse(v3.begin(), v3.end());
        ListNode *ans = nullptr, *tmp = nullptr, *prev = nullptr; 
        for(int i =0;i<v3.size();i++){
            tmp = new ListNode(v3[i]);
            if(!prev)ans = tmp;
            else prev->next = tmp;
            prev = tmp;
        }
        return ans;
    }
};
```

---
使用stack:利用堆疊先進後出的概念, 可以免去上面vector版的反轉, 除此之外並無不同, 執行速度比vector版快一點。

記得進位。
```
/**
 * 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> s1, s2;
        while(l1){
            s1.push(l1->val);
            l1=l1->next;
        }
        while(l2){
            s2.push(l2->val);
            l2=l2->next;
        }
        ListNode *ans = nullptr, *prev = nullptr, *tmp = nullptr;
        int c = 0;
        stack<int> s3;
        while(!s1.empty()||!s2.empty()){
            int n1 = 0, n2 = 0;
            if(!s1.empty()){
                n1 = s1.top();s1.pop();
            }
            if(!s2.empty()){
                n2 = s2.top();s2.pop();
            }
            int n = ((n1+n2+c)%10);
            s3.push(n);
            c = (n1+n2+c)>=10;
        }
        if(c==1){
            s3.push(1);
        }
        
        while(!s3.empty()){
            tmp = new ListNode(s3.top());s3.pop();
            if(!prev)ans = tmp;
            else prev->next = tmp;
            prev = tmp;
        }
        
        return ans;
    }
};
```