【LeetCode】2. 兩數相加

題目描述

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

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

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

示例:

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

解答思路

首先我們要搞清楚題意,即數字是按照鏈表逆序的方式存儲的,也就是說輸入和輸出的結果我們都是視爲逆序的。
所以 (2 -> 4 -> 3) + (5 -> 6 -> 4) 代表的就是 342 + 465,結果是807,所以我們的鏈表輸出是 (7 -> 0 -> 8)
這下就好辦了,我們需要做的就是遍歷鏈表的每一個元素,模擬數字的相加。鏈表的第一個元素相當於數字的個位數,第二個元素相當於數字的十位數,第n個元素以此類推。
遍歷的時候,只有當前元素不爲null的時候才能繼續遍歷,如果已經是null的話,直接將當前元素的值視爲0,不遍歷即可。

關於進位的運算:
設鏈表1當前數字爲a,鏈表2當前數字爲b,產生的進位爲carry。則有:

  1. 當前位相加後的數字 sum = a + b + carry
  2. 當前爲實際的數字 sum % 10
  3. 產生的進位 carry = sum / 10

注意
如果兩個鏈表都遍歷完之後,carry > 0 的話,則要在結果鏈表裏追加一個值爲0的鏈表節點。

具體思路如下

代碼

/**
 * 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 head = new ListNode(0);
        ListNode p1 = l1, p2 = l2, cur = head;
        int carry = 0;
        while (p1 != null || p2 != null) {
            int x = (p1 != null) ? p1.val : 0;
            int y = (p2 != null) ? p2.val : 0;
            int sum = x + y + carry;
            carry = sum / 10;
            cur.next = new ListNode(sum % 10);
            cur = cur.next;
            if (p1 != null) {
                p1 = p1.next;
            }
            if (p2 != null) {
                p2 = p2.next;
            }
        }
        if (carry > 0) {
            cur.next = new ListNode(carry);
        }
        return head.next;
    }
}
發佈了34 篇原創文章 · 獲贊 3 · 訪問量 3849
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章