LeetCode-兩數相加(Java)【單鏈表&解題思路】

題目:

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

我起初的想法很簡單:

初始化兩個鏈表,然後取出兩個鏈表中的每一個元素相加,然後再定義一個鏈表用於存儲這個求和產生的鏈表

在實現的過程中遇到了如下的問題:

  1. 測試方法中,輸出 addTwoNumbers 方法的返回值,輸出是hashcode值
  2. 沒有考慮到數字進位的問題(蠢到爆的問題😂)
  3. 函數返回 curr.next 爲空
  4. 上面的問題都解決了,報錯:Operator'' cannot be applied to 'int', 'addTwoNumbers. ListNode

解決上面問題的方法:

     1. 測試方法,在輸出addTwoNumbers方法返回值的時候,使用 System.out.print(sum.val);

     2. 解決進位問題:

carry = numsum / 10;//獲取進位的值
curr.next = new ListNode(numsum % 10);//取模運算,把個位數字存到鏈表sum中

    3. 因爲頭結點是沒有前一個結點的,因此我們要浪費一個空間使其總是以null作爲頭結點。所以返回的不應該是 curr.next 而應該是 sum.next;

    4. 解決 int 和 ListNode 不能相加的問題:

int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;

int numsum = carry + x + y;

 完整代碼:

public class addTwoNumbers {
    
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode sum = new ListNode(0);
        ListNode p = l1, q = l2, curr = sum;
        int carry = 0;//進位
        while(p != null || q != null) {
            //解決 Operator'' cannot be applied to 'int', 'addTwoNumbers. ListNode
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 0;

            int numsum = carry + x + y;
            carry = numsum / 10;//獲取進位的值
            curr.next = new ListNode(numsum % 10);//取模運算,把個位數字存到鏈表sum中
            curr = curr.next;

            if (p != null) p = p.next;
            if (q != null) q = q.next;

        }
        if (carry > 0) {
            curr.next = new ListNode(carry);
        }

        return sum.next;
    }
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(2);
        ListNode listNode2 = new ListNode(4);
        ListNode listNode3 = new ListNode(3);
        listNode1.next = listNode2;
        listNode2.next = listNode3;

        ListNode listNode21 = new ListNode(5);
        ListNode listNode22 = new ListNode(6);
        ListNode listNode23 = new ListNode(4);
        listNode21.next = listNode22;
        listNode22.next = listNode23;

        ListNode sum = addTwoNumbers(listNode1, listNode21);
        while (sum != null){
            System.out.print(sum.val);
            sum = sum.next;
            System.out.print("->");
        }
    }

}

 

 

 

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