445 兩數相加 II

2022-06-12 11:57:09 字數 1444 閱讀 1104

445. 兩數相加 ii

給你兩個非空鍊錶來代表兩個非負整數。數字最高位位於鍊錶開始位置。它們的每個節點只儲存一位數字。將這兩數相加會返回乙個新的鍊錶。

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

高階:

如果輸入鍊錶不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。

示例:

輸入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)輸出:7 -> 8 -> 0 -> 7

非常容易想到的方法是用棧分別儲存兩條鍊錶,再用頭插法新建出答案要求的鍊錶,**如下:

listnode* insertfromhead(listnode* head,int

k) listnode* addtwonumbers(listnode* l1, listnode*l2)

while

(l2)

int c=0

; listnode* res=null;

while(!st1.empty()||!st2.empty()||c!=0

)

if(!st2.empty())

sum+=c;

c=sum/10

; res=insertfromhead(res,sum%10

); }

return

res;

}

另一種做法就是遞迴,本來我覺得遞迴消耗的空間複雜度應該少一些的,結果可能遞迴本身占用的空間有點多,實際效果和上面差不多,但是思路還是很值得考量的:

void addtwo(listnode* l1,listnode* l2, listnode* flag, int&k)

else

l1->val=sum%10

; k=sum/10

; }

listnode* addtwonumbers(listnode* l1, listnode*l2)

while

(flag2)

int k=0

;

int c=len1-len2;

if(c<=0

) flag1=l1;

while(c--)

addtwo(l1,l2,flag1,k);  //前面的準備工作乙個是保證l1長於l2,二是使較短的l2的最高位與flag對齊

if(k==1

)

else

return

l1;

return

null;

}

445 兩數相加 II

這種題的用例是一定會搞一些很大的數的。long都會溢位,所以我們就不用嘗試轉數字做加法轉鍊錶的方法了。另外直接倒置兩個鍊錶再做加法的做法會改變原鍊錶,題幹也說了禁止改動原鍊錶。1.求兩個鍊錶長度,如果一長一短,把短的前面加若干個0節點,使得兩個鍊錶長度相同。之後對於就遞迴連線鍊錶。dfs函式引數為前...

445 兩數相加 II

演算法 由於鍊錶資料相加是逆序的,可以通過棧來儲存鍊錶資料,棧是先進後出,順序就變成了從末位相加,其實本題難度不大,就是不太容易想到使用棧來存資料計算。definition for singly linked list.public class listnode class solution tem...

445 兩數相加 II

445.兩數相加 ii 2.兩數相加 的擴充套件 definition for singly linked list.public class listnode class solution if c 0 return reverselist dummy.next 易錯點 優化 插入新煉表時可以採用...