# 【LeetCode】2. Add Two Numbers
## Question link
[Link](https://leetcode.com/problems/add-two-numbers/description/)
## Intuition
>You are given two **non-empty** linked lists representing two non-negative integers. The digits are stored in **reverse order**, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
> You may assume the two numbers do not contain any leading zero, except the number 0 itself.
> 題目表明給定是兩個 **non-empty** 的`ListNode`,表示的數字以 **reverse-order** 儲存,這意味著低位數字放在`ListNode` 的開頭,我們需要將兩個數字相加並以相同的方式返回`ListNode`
## Approach
1. 初始化一個`result`作為返回的結果,同時設置指標`p`指向這個鏈結
2. 初始化`num`以及`carry`,用於處理相加之後的結果與進位值,初始化為零
3. 接著需要遍歷兩個輸入鏈結與處理進位,直到兩個鏈結都處理完且所有進位也都處理完畢,所以條件為`while(l1 || l2 || carry)`
* 將`carry`賦值到`num`,用於處理有進位的數值
* 逐位將`l1`與`l2`值取出相加,如果有`l1`或`l2`的話,並且更新
* 將`carry`更新成當前的數值
* 將`num % 10`存入當前節點
4. 如果今天`l1`與`l2`都歷遍完成,需要檢查最後是否需要進位,但由於前面迴圈判斷式已經處理這個條件了所以這邊不要再判斷
5. 返回`result->next`,跳過初始化的頭節點(又稱哨兵節點sentinel node或者dummy head)
## Complexity
- Time complexity: $O(max(n_1, n_2))$
- Space complexity: $O(max(n_1, n_2))$
## Code
```c []
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* result = malloc(sizeof(struct ListNode));
struct ListNode* p = result;
result->val = 0;
result->next = NULL;
int carry = 0, num = 0;
while (l1 || l2 || carry){
num = carry;
if (l1) {
num += l1->val;
l1 = l1->next;
}
if (l2) {
num += l2->val;
l2 = l2->next;
}
carry = num / 10;
num = num % 10;
struct ListNode* new = malloc(sizeof(struct ListNode));
new->val = num;
new->next = NULL;
p->next = new;
p = p->next;
}
result = result->next;
return result;
}
```