兩數相加(Python3實現)

2021-09-14 05:12:49 字數 1911 閱讀 6067

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。

如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。

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

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

輸出:7 -> 0 -> 8

原因:342 + 465 = 807

第一種「暴力解法」是分別遍歷鍊錶 l1 和 l2 ,然後把得到的結果相加,再建立新鍊錶l3,當然了,想一想就好,一般暴力解法都容易超時。

第二種思路有些類似,就是在遍歷鍊錶的同時取值相加,唯一的難點就是在迴圈中使用同乙個變數增加鍊錶結點。這裡取了個巧,給head.next賦值,避免當前結點被覆蓋。同時返回結果也是l3.next,鍊錶可以看成乙個巢狀的字典。

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

addtwonumbers

(self, l1: listnode, l2: listnode)

-> listnode:

l3 = listnode(0)

head = l3

step =

0while l1 or l2 :

x = l1.val if l1 else

0 y = l2.val if l2 else

0

result = x + y + step

step = result //

10

head.

next

= listnode(result %10)

head = head.

next

l1 = l1.

next

if l1 else

none

l2 = l2.

next

if l2 else

none

if step ==1:

head.

next

= listnode(1)

return l3.

next

注意進製以及結點為 none 的情況的校驗。

值得一提的是注釋部分只是提示鍊錶的屬性,如果取消注釋是會報錯的,在 leetcode 上死活除錯不過,被小坑了一把,囧。

雖然超過了100%的python3提交,但是依然有優化的空間,演算法優化的本身就是和自己較勁嘛 ^_^ 。

比如我們可以假設一種極端情況,就是其中 l2 長度遠遠大於 l1 ,例如:24 + 382847278173498112933718......,那麼根據我們上面的演算法,每次都要重新相加,耗時且消耗額外的記憶體。

優化的思路是,當判斷到 l1 為 none 時,新鍊錶的剩下的結點就是 l2 剩下的結點,只要讓head.next = l2.next就可以了,無需重新計算。當然了,l2 也可能為 none。**的現有邏輯需要一些小變動,同時需要單獨判斷進製的情況。

具體實現待更 …

python3兩數相加的實現示例

給你兩個 非空 的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 1 輸入 l1 2,4,3 l2 5,6,4 輸出 7,0,8 ...

力扣 2 兩數相加 Python3

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

python3 兩數之和

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9...