題目:
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
我起初的想法很簡單:
初始化兩個鏈表,然後取出兩個鏈表中的每一個元素相加,然後再定義一個鏈表用於存儲這個求和產生的鏈表
在實現的過程中遇到了如下的問題:
- 測試方法中,輸出 addTwoNumbers 方法的返回值,輸出是hashcode值
- 沒有考慮到數字進位的問題(蠢到爆的問題😂)
- 函數返回 curr.next 爲空
- 上面的問題都解決了,報錯: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("->");
}
}
}