1. 程式人生 > >Leetcode---兩數相加--直觀解法(連結串列)

Leetcode---兩數相加--直觀解法(連結串列)

兩數相加

給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例

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

  • 思路分析:本題比較直觀,給出的連結串列權值低的在前,權值高的在後,很容易就想到遍歷兩個連結串列對應位相加即可
  • 需要注意的點在於,處理連結串列長度不同的情況,和產生進位的情況
  • 我們構造一個結果連結串列,每次對應位相加的值取餘加到結果連結串列上即可
  • 這裡的一個小技巧:構造結果連結串列時,構造一個空的頭結點,目的在於方便我們處理迴圈,否則將構造連結串列放在迴圈中執行很費事,要考慮是不是個位的相加,個位的相加要構造新的連結串列,非個位的相加只需要將結果加到結尾,我們這樣處理,只需要返回時返回result.next即可。

程式碼

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
	//判斷是否有一個連結串列為空
   	if
(l1==null) { return l2; }else if(l2==null) { return l1; } //從頭開始遍歷相加 ListNode result = new ListNode(0); ListNode rear = result; ListNode node = null; int temp = 0; while(l1!=null&&l2!=null) { temp = temp>=10?l1.val+l2.val+1:l1.val+l2.val; node =
new ListNode(temp%10); rear.next = node; rear = rear.next; l1 = l1.next; l2 = l2.next; } //迴圈退出時可能含有進位 while(l1!=null) { if(temp>=10) { temp = l1.val+1; //進位 node = new ListNode(temp%10); rear.next = node; rear = rear.next; l1 = l1.next; }else { rear.next = l1; //不進位 return result.next; } } while(l2!=null) { if(temp>=10) { temp = l2.val+1; //進位 node = new ListNode(temp%10); rear.next = node; rear = rear.next; l2 = l2.next; }else { rear.next = l2; //不進位 return result.next; } } if(temp>=10) { node = new ListNode(1); rear.next = node; } return result.next; }

在這裡插入圖片描述