###### 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;
}
};
```