題目:請編寫乙個函式,使其可以刪除某個鍊錶中給定的(非末尾)節點,你將只被給定要求被刪除的節點。
解析:由於只輸入了需要刪除的節點node,因此無法獲取刪除節點node的前乙個節點pre,從而也就無法將前乙個節點pre指向刪除節點的下乙個節點nex;
既然無法通過修改指標完成,那麼肯定要修改鍊錶節點的值了。
將刪除節點node的值和指標都改為下乙個節點nex的值和指標即可。
class
solution
:def
deletenode
(self, node)
: node.val = node.
next
.val
node.
next
= node.
next
.next
給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
# 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:
prenode = listnode(0)
lastnode = prenode
val =
0while val or l1 or l2:
val, cur =
divmod
(val +
(l1.val if l1 else0)
+(l2.val if l2 else0)
,10) lastnode.
next
= listnode(cur)
lastnode = lastnode.
next
l1 = l1.
next
if l1 else
none
l2 = l2.
next
if l2 else
none
return prenode.
next
defgeneratelist
(l:list)-
> listnode:
prenode = listnode(0)
lastnode = prenode
for val in l:
lastnode.
next
= listnode(val)
lastnode = lastnode.
next
return prenode.
next
defprintlist
(l: listnode)
:while l:
print
("%d, "
%(l.val)
, end='')
l = l.
next
print(''
)if __name__ ==
"__main__"
: l1 = generatelist([1
,5,8
])l2 = generatelist([9
,1,2
,9])
printlist(l1)
printlist(l2)
s = solution(
)sum
= s.addtwonumbers(l1, l2)
printlist(
sum)
方法1:遞迴
def
mergetwolist
(l1, l2)
:if l1 is
none
:return l2
elif l2 is
none
:return l1
elif l1.val < l2.val:
l1.next
= mergetwolist(l1.
next
, l2)
return l1
else
: l2.
next
= mergetwolist(l1, l2.
next
)return l2
方法2:迭代
def
merge_two_list
(l1, l2)
: prehead = listnode(-1
) prev = prehead
while l1 and l2:
if l1.val <= l2.val:
prev.
next
= l1
l1 = l1.
next
else
: prev.
next
= l2
l2 = l2.
next
prev = prev.
next
prev.
next
= l1 if l1 is
notnone
else l2
return prehead.
next
編寫乙個程式,找到兩個單鏈表相交的起始節點。
方法一: 暴力法
對鍊錶a中的每乙個結點 a,遍歷整個鍊錶 b 並檢查鍊錶 b 中是否存在結點和 a相同。
方法二:雜湊
將鍊錶a每個節點的值和指標儲存在雜湊表中,然後檢查鍊錶b中的每個節點是否在雜湊表中。
方法三:雙指標法
建立兩個指標 papa 和 pbpb,分別初始化為鍊錶 a 和 b 的頭結點。然後讓它們向後逐結點遍歷。
當 papa 到達鍊錶的尾部時,將它重定位到鍊錶 b 的頭結點 (你沒看錯,就是鍊錶 b); 類似的,當 pbpb 到達鍊錶的尾部時,將它重定位到鍊錶 a 的頭結點。
若在某一時刻 papa 和 pbpb 相遇,則 papa/pbpb 為相交結點。
想弄清楚為什麼這樣可行, 可以考慮以下兩個鍊錶: a= 和 b=,相交於結點 9。 由於 b.length (=4) < a.length (=6),pbpb 比 papa 少經過 22 個結點,會先到達尾部。將 pbpb 重定向到 a 的頭結點,papa 重定向到 b 的頭結點後,pbpb 要比 papa 多走 2 個結點。因此,它們會同時到達交點。
如果兩個鍊錶存在相交,它們末尾的結點必然相同。因此當 papa/pbpb 到達鍊錶結尾時,記錄下鍊錶 a/b 對應的元素。若最後元素不相同,則兩個鍊錶不相交。
判斷鍊錶是否是環形的
方法一:雜湊表
public boolean hascycle(listnode head)
else
head = head.
next;}
return false;
}
方法2:雙指標(快慢跑道)
def
hascycle
(head)
:if head is
none
or head.
next
isnone
:return
false
slow = head
fast = head.
next
while slow != fast:
if fast is
none
or fast.
next
isnone
:return
false
slow = slow.
next
fast = fast.
next
.next
return
true
鍊錶相關演算法
l.add two numbers leetcode 2 給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 原因 342 4...
演算法(鍊錶相關)
以下是鍊錶的一些基礎題目,但是通過這些題目的組合和解決問題的方法可以解決鍊錶的複雜問題,如k個為一組進行鍊錶翻轉就需要翻轉鍊錶的方法,整理基本題目如下方便複習。1.合併兩個有序鍊錶,合併後還是有序鍊錶 class solution elseelseelseelseelseelseelse 給頭節點乙...
鍊錶相關演算法題 面試必備(一)
向單鏈表尾部插入元素 刪除單鏈表中第乙個值為x的節點 刪除單鏈表中的目標節點 從尾到頭列印單鏈表 單鏈表中倒數第k個節點 反轉單鏈表 k個一組反轉翻單鏈表 鍊錶是否有環以及環的入口 struct listnode listnode inserttail listnode phead,int x li...