leetcode 2 two sum 兩數相加

2021-09-25 15:29:44 字數 1682 閱讀 9078

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

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

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

由於他是倒敘儲存的,所以實際上省去了很多的麻煩,我們可以通過乙個關係式來進行計算:

s =x

+y+c

arry

s = x + y + carry

s=x+y+

carr

y說明一下,這裡的x,y分別是第一,二個鍊錶的當前值,carry意思是有無進製,0表示沒有進製,1表示有進製。這樣我們就可以得到當前兩個鍊錶元素的和,一次迭代直到兩個鍊錶為空即可。

有幾點需要注意,因為兩個鍊錶可能不是等長,所以當乙個鍊錶結束,另乙個鍊錶還有元素的時候,我們就把已經結束的鍊錶節點的值置為0,繼續使用上面的公式計算,還有一點很重要,當運算結束後(即兩個鍊錶都為空時)我們還要進行一次進製的判斷,這裡非常非常重要!!!

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

(object):

defaddtwonumbers

(self, l1, l2)

:"""

:type l1: listnode

:type l2: listnode

:rtype: listnode

"""dummy = listnode(0)

l3 = dummy

carry =

0while l1 or l2:

# 記錄l1的值,並移動

x = l1.val if l1 else

0 l1 = l1.

next

# 記錄l2的值,並移動

y = l2.val if l2 else

0 l2 = l2.

next

s = carry+ x + y

# 進製除法判斷, 本位取餘數判斷

pop = s//

10 l3.

next

= listnode(s%10)

l3 = l3.

next

if pop >0:

l3.next

= listnode(1)

return dummy.

next

複雜度分析時間複雜度:o(max(m,n)),假設 m 和 n 分別表示 l1 和 l2 的長度,上面的演算法最多重複 max(m,n) 次。

空間複雜度:o(max(m,n)), 新列表的長度最多為 max(m,n)+1。

leetcode系列 twosum問題

題目描述 輸入 乙個陣列 nums 乙個數 target 輸出 從陣列中取兩個數使得兩數之和等於target,輸出這兩個數的下標 1,一開始的想法是,使用兩重迴圈直接一一遍歷,窮舉出這兩個數,並得到他們的下標 public static int twosum1 int nums,int target...

leetcode程式設計筆記 一 two sum

1.題目 輸入乙個陣列nums,根據所給的target 目標數 返回兩個元素的索引x y,假定 nums x nums y target且x,y唯一 2.演算法分析 得到目標元素需要將每個元素和其他元素相加計算結果和,通常有如下幾種方案 演算法複雜度 o nl ogn 哈西搜尋 演算法複雜度 o n...

leetcode 兩數之和(Two Sum)

暴力法很簡單。遍歷每個元素 xx,並查詢是否存在乙個值與 target xtarget x 相等的目標元素。public int twosum int nums,int target throw new illegalargumentexception no two sum solution 複雜度...