> For the complete documentation index, see [llms.txt](https://r24zeng.gitbook.io/leetcode-notebook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://r24zeng.gitbook.io/leetcode-notebook/bu-chong-81100-dao/2.-add-two-numbers.md).

# 2. Add Two Numbers

\# Medium

{% hint style="info" %}
Key idea: when add node, must initilize a node first, then assgin to the result. Keep head node.
{% endhint %}

{% tabs %}
{% tab title="C++(complicated version)" %}

```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 *res=nullptr;
        ListNode *head;
        int sum = 0;
        while(l1 && l2) {
            sum += l1->val + l2->val;
            ListNode* node = new ListNode(sum%10);
            sum = sum/10;
            l1 = l1->next;
            l2 = l2->next;
            if(res == nullptr) {
                res = node;
                head = node;
                continue;
            }
            res->next = node;
            res = res->next;
        }
        
        // if l1 is longer
        while(l1) {
            sum += l1->val;
            l1 = l1->next;
            ListNode* node = new ListNode(sum%10);
            sum = sum/10;
            if(res == nullptr) {
                res = node;
                head = node;
                continue;
            }            
            res->next = node;
            res = res->next;
        }
        
        // if l2 is longer
        while(l2) {
            sum += l2->val;
            l2 = l2->next;
            ListNode* node = new ListNode(sum%10);
            sum = sum/10;
            if(res == nullptr) {
                res = node;
                head = node;
                continue;
            }            
            res->next = node;
            res = res->next;
        }
        
        if(sum == 1) {
            ListNode* node = new ListNode(sum);
            res->next = node;
        }
        
        return head;
    }
};
```

{% endtab %}

{% tab title="C++(easy version)" %}

```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 *res=nullptr;
        ListNode *head;
        int sum = 0;
        while(l1 || l2) {
            int val1 = l1? l1->val: 0;
            int val2 = l2? l2->val: 0;
            sum += val1 + val2;
            ListNode* node = new ListNode(sum%10);
            sum = sum/10;
            if(l1) l1 = l1->next;
            if(l2) l2 = l2->next;
            if(res == nullptr) {
                res = node;
                head = node;
                continue;
            }
            res->next = node;
            res = res->next;
        }
        
        if(sum) {
            ListNode* node = new ListNode(1);
            res->next = node;
        }
        
        return head;
    }
};
```

{% endtab %}
{% endtabs %}
