1. 程式人生 > >LeetCode刷題筆記(二)兩數相加

LeetCode刷題筆記(二)兩數相加

題目:

給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

ListNode類

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}
解法:
class Solution {
    ListNode result = new ListNode(0);  //定義計算結果的node
    ListNode head = result;             //頭節點
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        add(l1,l2,0);
        return head.next;
    }
     //遞迴計算   addNumber是進位
    public void add(ListNode l1, ListNode l2,int addNumber){
        if(l1 != null || l2 != null){
            int num = (l1==null?0:l1.val) + (l2==null?0:l2.val) + addNumber;    
            addNumber = num/10;     //計算進位
            num = num%10;     
            ListNode node = new ListNode(num);
            result.next = node;    
            result = node;
            add(l1==null?l1:l1.next,l2==null?l2:l2.next,addNumber);
        }else if(addNumber!=0){
            result.next = new ListNode(addNumber);
        }   
    }   
}

演算法如上,從頭節點開始遞迴進行加法,進位賦值給addNumber,個位數部分建立新的節點,讓result節點的next指向新的節點,再把result節點更換為新節點,進行下一次計算,當兩個節點都為空的時候,退出遞迴。

注意點:兩個連結串列長度不一樣時要進行判斷,如果節點為null,補0計算。退出遞迴時,要把最後的進位加上。

時間複雜度:O(n);

空間複雜度:O(n);