LeetCode刷題筆記(二)兩數相加
阿新 • • 發佈:2019-02-09
題目:
給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。
你可以假設除了數字 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);