嗨,我正試圖解決一些問題,但難以確定我的錯誤... :(
)問題的描述:
給你兩個非空的鏈接串列,代表兩個非負的 整數。這些數字以相反的順序存盤,并且它們的每個 節點包含一個數字。將這兩個數字相加,并將總和 作為一個鏈表。
你可以假設這兩個數字不包含任何前導0,除了數字0本身。 數字0本身。
示例:
輸入:l1 = [2,4,3], l2 = [5,6,4]
輸出。[7,0,8]
解釋:342 465 = 807.
我的代碼:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
String firstNumber = ""/span>。
String secondNumber = ""/span>;
//將串列轉換為字串。
while (l1 != null){
firstNumber = Integer.toString(l1.val)。
l1 = l1.next;
}
while (l2 != null){
secondNumber = Integer.toString(l2.val)。
l2 = l2.next;
}
//反轉字串。
firstNumber = new StringBuilder(firstNumber).reverse().toString()。
secondNumber = new StringBuilder(secondNumber).reverse().toString();
long additionLong = Long.parseLong(firstNumber) Long.parseLong(secondNumber)。
ListNode solutionList = new ListNode() 。
ListNode prevNode = new ListNode() 。
ListNode currentNode = solutionList;
while ( additionLong > 0){
currentNode.val = (int) additionLong % 10;
additionLong /= 10;
ListNode nextNode = new ListNode() 。
currentNode.next = nextNode;
prevNode = currentNode;
currentNode = currentNode.next;
}
prevNode.next = null。
return solutionList;
}
我在通過以下測驗時遇到困難,我似乎無法確定問題所在。
Input
l1 = [9]
l2 = [1,9,9,9,9,9,9,9,9]
我的輸出
[8,0,0,0,0,0,0,0,0,0,1]
預計
[0,0,0,0,0,0,0,0,0,0,1]
我懷疑麻煩的步驟是當我把兩個反轉的字串加在一起時,但代碼確實通過了其他一些測驗,所以我不明白為什么它不能通過這個測驗。
此外,到目前為止,在我的學位中,我們只上了兩門非常基本的Java和C語言的入門課程,而且我們只涉及到了基礎知識,所以我們并沒有真正學會如何寫好代碼,如果我在代碼中做了一些愚蠢的事情,請讓我知道,以便我知道如何避免。
uj5u.com熱心網友回復:
你的方法似乎有些復雜。你正在做一個算術問題;這可能不是涉及字串的正確方法。
想想你(也許)在小學時是如何學習做加法的:你將各列相加,從最小的有效數字開始,將超過 10 的數額帶到下一列。
這里的問題被簡化了,因為最小有效數字排在前面。因此,你只需要為當前列創建一個新的節點,計算它的值,并將超過的部分帶到下一列。
由于串列的長度不同,情況略顯復雜,但這并不難處理:如果你在一個串列中的數字 "用完了",你可以假裝它包含一個零。
這段代碼將只是列印出和的數字;如果需要的話,你應該試著找出如何建立一個包含結果的鏈接串列:
int carry = 0;
//我們希望在有更多的東西要添加時進行迭代 - 即使
//我們已經超過了一個或兩個串列的長度,我們可能仍然有攜帶。
while (l1 != null || l2 != null || carry != 0) {
//從每個串列中獲取值。如果我們已經超過了的末端
//一個串列,就用0作為值。
int i1 = l1 != null ? l1.value : 0;
int i2 = l2 != null ? l2.value : 0;
int value = i1 i2 carry。
///接下來的carry是value的十位數。
carry = value / 10。
//當前列中的值是值的單位。
value = value % 10。
//列印出當前列中的值。
System.out.println(value)。
///推進兩個鏈接串列(假設我們還沒有到達終點)。
if (l1 != null) l1 = l1.next。
if (l2 != null) l2 = l2.next。
uj5u.com熱心網友回復:
在你將串列轉換為字串之后,你有:
String firstNumber = "243" ; /or firstNumber = "9";/span>
String secondNumber = "564"; //secondNumber = "1999999999";
//反轉字串。
firstNumber = new StringBuilder(firstNumber).reverse().toString()。
secondNumber = new StringBuilder(secondNumber).reverse().toString();
//add
Long sum = Long.valueOf(firstNumber) Long.valueOf(secondNumber)。
//reverse sum[/span]。
String output = new StringBuilder(String。 valueOf(sum)).reverse().toString()。
System.out.println(output)。
如果你需要將輸出分成一個陣列,只需將其改為:
//reverse sum and split it
String[] output =new
StringBuilder(String.valueOf(sum)).reverse().toString().split(""/span>)。
System.out.println(Arrays.toString(output))。
uj5u.com熱心網友回復:
如果你有一把錘子,每一個問題看起來都像一個釘子。
使用String是一樣的。
不如展示一個更抽象的方法。
如果你有67[7, 6]和398[8, 9, 3],你將如何添加?
- 7 8給5,帶1
- 6 9 carry給6,帶1 。
- N/A 3 carry給4,帶0 。
- N/A N/A carry給出N/A 。
所以:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode sum = null。
ListNode last = null;
int carry = 0;
while (l1 != null && l2 != null) {
int sum = carry;
if (l1 != null) {
sum = l1.value;
l1 = l1.next;
}
if (l2 != null) {
sum = l2.value;
l2 = l2.next;
}
carry = 0;
if (sum >= 10) {
carry = 1;
sum -= 10;
}
ListNode sumNode = ...。
...
}
if (carry != 0) { // an extra digit..
...
}
return sum;
}
uj5u.com熱心網友回復:
如果我在代碼中做了一些愚蠢的事情,請讓我知道,以便我知道如何避免它。
在將結果投給long時有一個問題:
currentNode.val = (int) additionLong % 10;
這將把additionLong投給int,這將導致損失,然后才將% 10應用于此。你需要:
currentNode.val = (int) ( additionLong % 10) 。
這將解決這個特定測驗案例的問題。
正如其他人所說,你應該考慮在不轉換linked list、string和long之間的情況下進行轉換。你可能會遇到long的容量不夠的測驗案例,然后你就會真正陷入困境。
相反,堅持只使用鏈接串列,逐位處理。這就是練習的目的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/319957.html
標籤:
