Leetcode --Add Two Numbers(Medium)
===
## Description:
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.
### Constrains:
* The number of nodes in each linked list is in the range [1, 100].
* 0 <= Node.val <= 9
* It is guaranteed that the list represents a number that does not have leading zeros.
### Example:
**Input** Linked list l1 = [2,4,3]
**Input** Linked list l2 = [5,6,4]
**Output** Linked list = [7,0,8]
**Explanation**: 342 + 465 = 807
*Note* :Linked list以反向擺放,要求輸入相加後輸出.
---
## Solution:
給一個進位bit,個別相加後再加上進位,最後考慮最後一個是否進位,若有則給新的list.
```java=
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int carry =0;
ListNode l3 = new ListNode();
ListNode be = l3 ;
while(l1 !=null || l2 !=null)
{
if(l1 !=null && l2 !=null)
{
int p = carry + l1.val + l2.val;
carry =0;
if(p>=10)
carry =1;
p %= 10;
be.val = p;
if(l1.next != null || l2.next !=null)
{
be.next = new ListNode();
be =be.next;
}
l1 =l1.next;
l2 =l2.next;
}
else if(l1 !=null)
{ int p = carry + l1.val ;
carry =0;
if(p>=10)
carry =1;
p %= 10;
be.val = p;
if(l1.next != null )
{
be.next = new ListNode();
be =be.next;
}
l1 =l1.next;
}
else
{
int p = carry+l2.val;
carry =0;
if(p>=10)
carry =1;
p %= 10;
be.val = p;
if(l2.next != null )
{
be.next = new ListNode();
be =be.next;
}
l2 =l2.next;
}
}
if(carry ==1 )
be.next = new ListNode(carry);
return l3;
}
}
```
**line 15 :** 給一個指標be去操作linked list讓head不會跑掉
**line 18,38,56 :** 分三個case,==1.== l1,l2都未空, ==2.== l1未空,l2空 , ==3.== l1空,l2未空
**line 29 :** 如果l1,l2尚未空再新增list,避免新增出空的list而未使用.
**line 76 :** 對最後一bit若還要進位,則多新增一位list
### Submissions on Leetcode
Runtime: **3 ms** , faster than **11.23%** of Java online submissions for Add Two Numbers.
Memory Usage: **44.4 MB** , less than **5.01%** of Java online submissions for Add Two Numbers.
## Complexity analysis
要遍歷所有list.
### => ==O(max(l1.size,l2.size))==
## Conclusion
再判斷l1,l2是否為空的地方還可以寫更少,還有加上carry的條件,因為不能加null所以分成很多case,多設置一個empty list初值設為0就可以做加法,使速度上升.
參考解答: Reference trysingtime on leetcode
Runtime: **2 ms** , faster than **98.80%** of Java online submissions for Add Two Numbers.
Memory Usage: **41.3 MB** , less than **100.00%** of Java online submissions for Add Two Numbers.
```java=
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int carry = 0;
ListNode emptyNode = new ListNode(0);
ListNode currentNode = new ListNode(0);
ListNode result = currentNode;
while (emptyNode != l1 || emptyNode != l2) {
int sum = l1.val + l2.val + carry;
carry = sum / 10;
currentNode = (currentNode.next = new ListNode(sum %= 10));
l1 = null != l1.next ? l1.next : emptyNode;
l2 = null != l2.next ? l2.next : emptyNode;
}
if (carry == 1)
currentNode.next = new ListNode(carry);
return result.next;
}
```
line 9 : 等同於
```java=
currentNode.next = new ListNode(sum %= 10);
currentNode = currentNode.next;
```
###### tags: `Leetcode` `Medium` `LinkedList`