Leetcode---兩數相加--直觀解法(連結串列)
阿新 • • 發佈:2018-12-05
兩數相加
給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。 您可以假設除了數字 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;
}