# 2.Add Two Numbers <span class='tag' data-diff='medium'></span>
{%hackmd RN5D4nggQRO8wzNqxuvlNw %}
## 題目
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 contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
**Example:**
```
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.
```
## 思路
這一題算是滿有趣的題目,有一點點在仿硬體加法器的味道。題目有幫你先定義好link list的class:
```javascript
function ListNode(val, next) {
this.val = (val===undefined ? 0 : val)
this.next = (next===undefined ? null : next)
}
```
首先先初始化結果link list和一個指標,目前都指向同一個物件,還有進位(carry)初始為0。
```javascript
let ptr = res = new ListNode(),
carry = 0;
```
接下來用一個while迴圈,計算目前位置的值與進位,要進到下一個iteration時,把$l_1$、$l_2$都指向他們的next,如果$l_1$、$l_2$都沒有下一位的話,跳離迴圈,否則幫指標建立一下一位,同樣為一個ListNode物件,初始值為當前的進位。
離開迴圈後,如果此時進位不是0,代表結果比$l_1$、$l_2$都還要多出一位,此時就需要再幫指標建立新的node。
```javascript
while(1){
ptr.val += ((l1 || new ListNode()).val + (l2 || new ListNode()).val);
carry = Math.floor(ptr.val / 10);
ptr.val %= 10;
if((l1 || new ListNode()).next || (l2 || new ListNode()).next){
ptr.next = new ListNode(carry);
ptr = ptr.next;
l1 = (l1 || new ListNode()).next;
l2 = (l2 || new ListNode()).next;
}
else break;
}
if(carry) ptr.next = new ListNode(carry);
return res;
```
由於l1、l2不一定有相同的位數,而且可能差了很多位,為了避免對null物件呼叫next而發生錯誤,每此指向他們next時,需要或運算一個空的ListNode物件,由於$l_1$、$l_2$再`||`的前面,只有在他們為`null`時,或運算才會計算。
指標(pointer)通常是在計概才會提到的東西,而且多以C++為例子,所以用javascript寫,常常會不知道變數通常是pass by value還是pass by reference,要再深入一點研究。