LeetCode 解題報告 - 2. Add Two Numbers

weixin_34116110發表於2016-10-09

從今天開始,寫一下我在刷 LeetCode 時的心得體會,包括自己的思路和別人的優秀思路,歡迎各種監督啊! 2016/10/9
程式語言是 Java,程式碼託管在我的 GitHub 上,包括測試用例。歡迎各種批評指正!

<br />

題目 —— Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
<br >

解答

  • 題目大意
    給出兩個連結串列,代表非負整數,每一位數字反向儲存在一個結點中。將兩個數字相加,並以連結串列形式返回。

  • 解題思路

    • 我們先來審題,反向儲存意味著我們從連結串列頭部開始加即可,這樣省去了不少麻煩,唯一存在的問題是考慮進位。
  • 我們在寫程式碼的時候,先考慮返回值,既然是返回一個連結串列,我們就必須知道頭結點的指標。那麼怎樣遍歷連結串列呢?所以我們需要兩個指標,一個指向頭部的位置,一個是活動的指標,隨著元素的新增而移動。

  • 我們在計算結果的時候,是不是把 l1 連結串列和 l2 連結串列對應結點上的值加起來就行了?是的,再加上一個變數 carry 來表示進位即可。這裡的關鍵在於迴圈退出的條件:

    • 兩條連結串列不一定等長,所以我們 while 迴圈中使用 || 來把兩條連結串列都遍歷到。
    • 兩條連結串列都遍歷完的時候,carry 值可能不為 0。同樣的,使用邏輯符號 || 即可解決問題,對於 sum 的計算,我們使用問號表示式。
  • 最後,記得對 l1 和 l2 的指標進行步進,否則就陷入無限迴圈啦。

  • 程式碼實現

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode prev = new ListNode(0);
        ListNode tmp = prev;
        int carry = 0;
        int sum = 0;
        
        while (l1 != null || l2 != null || carry != 0) {
            sum = ((l1 == null) ? 0 : l1.val) + ((l2 == null) ? 0 : l2.val) + carry;
            carry = sum / 10;
            sum %= 10;
            tmp.next = new ListNode(sum);
            
            l1 = (l1 == null) ? l1 : l1.next;
            l2 = (l2 == null) ? l2 : l2.next;
            tmp = tmp.next;
        }
        return prev.next;
    }
}
  • 小結
    由於數字儲存是倒序的,這個問題總體來說比較好解決。需要注意的問題就是,迴圈退出的條件。另外,對於空連結串列的處理上,問號表示式也是比較取巧的一種方式。

相關文章