演算法題 鍊錶相關

2021-10-03 20:06:26 字數 4330 閱讀 2553

題目:請編寫乙個函式,使其可以刪除某個鍊錶中給定的(非末尾)節點,你將只被給定要求被刪除的節點。

解析:由於只輸入了需要刪除的節點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...