--- 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] ``` -->