Java算法練習——兩數相加


題目鏈接

題目描述

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例

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

題解

/**
 * 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) {
        ListNode q = l1, p = l2;
        ListNode dummyHead = new ListNode(0);
        ListNode carr = dummyHead;
        int carry = 0;
        while (q != null || p != null) {
            int x = q != null ? q.val : 0;
            int y = p != null ? p.val : 0;
            
            int sum = x + y + carry;
            
            carry = sum / 10;
            
            carr.next = new ListNode(sum % 10);
            carr = carr.next;
            if (q != null) q = q.next;
            if (p != null) p = p.next;
        }
        
        if (carry > 0) {
            carr.next = new ListNode(carry);
        }
        return dummyHead.next;
    }
}

手記

carry(進位)是一個很重要的變量,兩個一位數相加,進位只可以是 0 或 1 ,兩個數相加再加前數的進位,最大值也只為 19,例如 96 + 97,個位相加:得 3 進 1,十位相加為:9 + 9 + 1 = 19。

再看此題,鏈表為逆序存儲數字,我們讀取數字時,就是從最低位開始的,這符合我們的運算習慣。我們每讀取兩個鏈表的各一位數字,便將它們與前進位相加,結果超過 10 的部分為本次運算的進位,不超過 10的部分為本次運算留在本位的值,只要兩個鏈表有一個不為空,兩個鏈表將再次進位計算。

30行代碼表示,如果計算結束,但上次進位值大於 0(值為 1),則將進位補到最高位。

很不錯的題,優解的寫法看的讓人着迷。
以上


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM