我正在做 LeetCode 挑戰“添加兩個數字”
給定兩個代表兩個非負整數的非空鏈表。這些數字以相反的順序存盤,并且它們的每個節點都包含一個數字。將兩個數字相加并將總和作為鏈表回傳。
您可以假設這兩個數字不包含任何前導零,除了數字 0 本身。
我正在撰寫一個解決方案,但觀察到一些我無法理解的奇怪行為。(我認為問題出在我的 for 回圈中)。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
l1= reverseList(l1);
l2= reverseList(l2);
String str1 = returnListAsString(l1);
String str2 = returnListAsString(l2);
Integer int1 = Integer.valueOf(str1.toString());
Integer int2 = Integer.valueOf(str2.toString());
Integer sum = int1 int2;
System.out.println("sum.." sum);
char[] ch = String.valueOf(sum).toCharArray();
ListNode result = l1;
for (int i=0; i<ch.length; i ) {
System.out.println("test.." ch[i]);
result.val = ch[i];
System.out.println("test2.." result.val);
result = result.next;
}
return result;
}
public ListNode reverseList(ListNode l1) {
ListNode previous = null;
ListNode curr = l1;
ListNode next = null;
while (curr != null) {
next = curr.next;
curr.next = previous;
previous = curr;
curr = next;
}
l1 = previous;
return l1;
}
public String returnListAsString(ListNode l1) {
StringBuilder str1 = new StringBuilder();
while (l1 !=null) {
str1.append(l1.val);
l1 = l1.next;
}
return str1.toString();
}
}
這是我的輸入
[2,4,3] [5,6,4]
標準輸出
總和..807 測驗..8 測驗2..56 測驗..0 測驗2..48 測驗..7 測驗2..55
輸出
[]
我認為問題出在我的 for 回圈中。我的問題是,為什么 test 和 test2 不相等,我怎樣才能得到至少顯示 [8,0,7] 的輸出?
uj5u.com熱心網友回復:
我認為問題出在我的 for 回圈中
確實。你設定result
為l1
. 然后你分配result
給result.next
. 最終您將 null 分配給result
. 因此你的“空”輸出。陣列中的第一個元素char
,即ch
需要成為最后一個ListNode
。中的第二個元素ch
需要成為倒數第二個ListNode
。
這是我對您的代碼的重寫:
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
l1 = reverseList(l1);
l2 = reverseList(l2);
String str1 = returnListAsString(l1);
String str2 = returnListAsString(l2);
Integer int1 = Integer.valueOf(str1.toString());
Integer int2 = Integer.valueOf(str2.toString());
Integer sum = int1 int2;
System.out.println("sum.." sum);
char[] ch = String.valueOf(sum).toCharArray();
ListNode result = null;
ListNode temp = new ListNode(ch[0] - '0');
for (int i = 1; i < ch.length; i ) {
System.out.println("test.." ch[i]);
result = new ListNode(ch[i] - '0', temp);
temp = result;
System.out.println("test2.." result.val);
}
return result;
}
public ListNode reverseList(ListNode l1) {
ListNode previous = null;
ListNode curr = l1;
ListNode next = null;
while (curr != null) {
next = curr.next;
curr.next = previous;
previous = curr;
curr = next;
}
l1 = previous;
return l1;
}
public String returnListAsString(ListNode l1) {
StringBuilder str1 = new StringBuilder();
while (l1 != null) {
str1.append(l1.val);
l1 = l1.next;
}
return str1.toString();
}
public static void main(String[] args) {
ListNode three = new ListNode(3);
ListNode four = new ListNode(4, three);
ListNode two = new ListNode(2, four);
ListNode fore = new ListNode(4);
ListNode six = new ListNode(6, fore);
ListNode five = new ListNode(5, six);
Solution soln = new Solution();
ListNode rslt = soln.addTwoNumbers(two, five);
System.out.println("Result: " soln.returnListAsString(rslt));
}
}
class ListNode {
int val;
ListNode next;
ListNode() {
this(0);
}
ListNode(int val) {
this(val, null);
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
運行上述代碼時的輸出:
sum..807
test..0
test2..0
test..7
test2..7
Result: 708
我很欣賞這些回應,我意識到我的解決方案不是最佳的,但我最初的問題是為什么在標準輸出中回傳的 test 和 test2 值不相等?
我相信我已經回答了你的問題。
uj5u.com熱心網友回復:
您的“test”輸出列印一個字符的字串表示,您的“test2”輸出列印該字符的整數值。的整數值為'0'
48(ASCII 或 UTF8 編碼)。
您必須將char
值決議回正確的int
:
result.val = Integer.parseInt("" ch[i]);
仍然是一個非常復雜的解決方案,如果@Abra 是正確的,我建議您不要先將數字轉換為任何物件,而是逐位添加它們并保持溢位(大于 9 的任何內容)用于下一個數字。
當兩個數字的長度不同并且輸入的最后一位溢位被附加到輸出時,您仍然必須小心。
這種方法還可以避免您再次反轉結果,它的輸出是從最低有效值到最高值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/518608.html
標籤:爪哇
下一篇:具有多屬性的鏈表