給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 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 複雜度...