---
tags: leetcode
---
# [2. Add Two Numbers](https://leetcode.com/problems/add-two-numbers/)
---
# My Solution
## The Key Idea for Solving This Coding Question
## C++ Code
```cpp=
/**
* 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) {
ListNode *dummy = new ListNode(), *curr = dummy;
int carry = 0;
while (l1 != nullptr || l2 != nullptr) {
int sum = carry;
if (l1 != nullptr) {
sum += l1->val;
l1 = l1->next;
}
if (l2 != nullptr) {
sum += l2->val;
l2 = l2->next;
}
carry = sum /10;
sum %= 10;
curr->next = new ListNode(sum);
curr = curr->next;
}
if (carry != 0) {
curr->next = new ListNode(1);
}
curr = dummy->next;
delete dummy;
return curr;
}
};
```
## Time Complexity
$O(max(m,n))$
$m$ 為 $l1$ 的長度
$n$ 為 $l2$ 的長度
## Space Complexity
$O(max(m,n))$
# Miscellaneous
## Related Coding Questions
:::spoiler {state="close"} (變形題) [67. Add Binary](https://leetcode.com/problems/add-binary/)
```cpp=
class Solution {
public:
string addBinary(string a, string b) {
int i = a.size() - 1, j = b.size() - 1;
int carry = 0;
string answer;
while (i >= 0 || j >= 0) {
int sum = carry;
if (i >= 0) {
sum = sum + (a[i] - '0');
--i;
}
if (j >= 0) {
sum = sum + (b[j] - '0');
--j;
}
carry = sum / 2;
sum %= 2;
answer.push_back(sum + '0');
}
if (carry != 0) {
answer.push_back(carry + '0');
}
int left = 0, right = answer.size() - 1;
while (left < right) {
swap(answer[left++], answer[right--]);
}
return answer;
}
};
```
:::
<!--
# Test Cases
```
[2,4,3]
[5,6,4]
```
```
[0]
[0]
```
```
[9,9,9,9,9,9,9]
[9,9,9,9]
```
```
[5]
[5]
```
```
[1]
[9,9]
```
```
[1,8]
[0]
```
-->