力扣(Leecode)-2-兩數相加-Java

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

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

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

示例:

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

思路:因爲存的時候是倒序存的,所以頭部依次是個位數、十位數、百位等等。

輸出是個鏈表,則新建一個鏈表去存儲,新鏈表的頭部用pre,頭部不存數據所以最後返回的是pre.next,當前位置用cur來表示。

循環條件應該是最長的那個鏈表的長度,比如l1最長,爲4,l2長度爲3,那麼第四次的時候l2的值應爲0.

每次把l1和l2當前節點的值賦給x,y,要麼是空值,要麼是有值。

用一個carry標誌位當成進位標誌,sum = x+y+carry; 算當前值,賦給cur,然後算carry,更新carry。

需要移動l1、l2,cur指針,向後移。

至此本輪計算結束。

最後返回pre.next即可。

忽略了一點的就是,兩個鏈表長度相等,且最高位有進位的時候,此時while循環爲Flase,,carry爲1。需要處理一下。

/**
 * 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) {
        int carry = 0;
        ListNode pre = new ListNode(0);
        ListNode cur = pre;
        int sum;
        while(l1 != null || l2 != null){
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            sum = x + y + carry;

            carry = sum / 10;
            sum = sum % 10;
            cur.next = new ListNode(sum);
            cur = cur.next;
            if(l1 != null) {
                l1 = l1.next;
            }
            if(l2 != null){
                l2 = l2.next;
            }
        }
        if(carry == 1){
            cur.next = new ListNode(carry);
        }
        return pre.next;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章