LeetCode-2 兩數相加

  • 題目:2. 兩數相加
  • 難度:中等
  • 分類:鏈表
  • 解決方案:鏈表的遍歷

題目描述

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

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

分析

這個題理解起來難度不大,就是將數字從個位數開始將數字放到鏈表的各個結點上,如下所示:


鏈表表示數字.png

然后兩個鏈表的對應位置上的數字相加,將相加的值保存到結果鏈表中。這里需要注意兩個關鍵點:一是如果兩個值相加大于9該怎么辦?二是兩個鏈表長度不一致該怎么辦?
對于關鍵點一:我們需要借助一個進位標識carry,當兩數之和大于9時將carry標識為1,否則標識為0。
對于關鍵點二:我們以最長鏈表作為終點,對于較短鏈表對應位置的數值,我們用0來補齊。
下面分析一個具體實例,該實例包含上述兩個關鍵點,如下圖所示:

兩數相加.png

如上圖所示,數字342的鏈表較短,數字7465的鏈表較長。當兩個數字的第二個結點相加時,它們的和為10,這時就需要進位,即carry=1,且將個位數保留作為結果鏈表的值。當較短的鏈表指向為null結點時,較長的鏈表指向的值為7,這需要將較短鏈表的值設置為0,即結果為0+7。
通過上面分析后,再看看如下java便一目了然。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 創建結果鏈表的頭節點,默認該節點中的value為-1
        ListNode dummy = new ListNode(-1);
        ListNode pre = dummy;
        // 進位標識carry,默認為0
        int carry = 0;
        // 遍歷鏈表,當兩個鏈表都為空時,退出
        while(l1 != null || l2 != null){
            // 判斷該節點是否為空,當結點為空時,用0補齊;不為空時,加數即為節點的值
            int d1 = (l1 == null) ? 0 : l1.val;
            int d2 = (l2 == null) ? 0 : l2.val;
            // 對結點求和,注意:求和是需要考慮到進位
            int sum = d1 + d2 + carry;
            // 更新進位標識
            carry = (sum >= 10) ? 1 : 0;
            // sum%10標識求和的個位數,將其保存到結果鏈表中
            pre.next = new ListNode(sum % 10);
            pre = pre.next;
            if(l1 != null) l1 = l1.next;
            if(l2 != null) l2 = l2.next;
        }
        
        // 重點,這是一個特殊情況,當兩個鏈表計算完后,
        // 還需要判斷進位標識是否為1,如果為1,如23+81=104,需要創建一個結點保存最高位
        if(carry == 1)
            pre.next = new ListNode(1);
        
        return dummy.next;  
    }
}
兩數相加計算結果.png

對于時間復雜度和空間復雜度,該題都為O(n)。

Github地址

LeetCode-2 兩數相加

參考鏈接

2. 兩數之和

更多文章,請掃描二維碼關注『算法半島』
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,并且它們的每個節點只...
    羅健倫閱讀 185評論 0 0
  • 2. 兩數相加給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲,它們的每個節點只存儲單個數字。將兩數相加返...
    杏仁小核桃閱讀 219評論 0 1
  • 題目描述 You are given two non-empty linked lists representin...
    玩大神的簡書閱讀 140評論 0 0
  • 2. 兩數相加 給出兩個非空的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式存儲的,并且它們的每...
    liulei_ahu閱讀 288評論 0 2
  • 做人一輩子,人品做底子。 品行是一個人的內涵, 名譽是一個人的外貌。 做人德為先,待人誠為先,做事勤為先。 道德可...
    TWE閱讀 1,687評論 0 0