鍊錶之鍊表含環,相交等問題

2021-10-07 22:45:43 字數 2756 閱讀 9840

兩個鍊錶,可能相交,找出相交的節點,給出證明

1.若兩個單鏈表乙個為有環,乙個無環. 那麼肯定不能相交.

2.若二者都沒有環, 問題就轉化為 兩個無環單鏈表是否相交,是否能找到第乙個相交的節點,方法就是 快慢指標 。

3.若二者都有環,那麼問題變成了兩個有環單鏈表是否相交.

第一,先找到二者是否相交.

第二,若相交則需要遍歷一遍找到相交點.

無環情況:

編寫乙個程式,找到兩個單鏈表相交的起始節點。

如下面的兩個鍊錶:

在節點 c1 開始相交。

解析:要想判斷是否相交,肯定要看是否能找到相交的點,如果能讓兩個指標同時走到相交點,也就可以確定兩個鍊錶相交。因為相交後兩個鍊錶到終點的距離相等,那麼只要兩個指標能夠消除兩個鍊錶之間的長度差就可以到達終點的距離相等。假設鍊錶a比b長,pb到達結尾後指向heada,然後繼續向前遍歷,當pa到達結尾後指向headb,此時兩者的長度差就消除了繼續遍歷如果兩者指向同一節點,返回節點,如果兩者都走到結尾依然沒有相交,就返回null

class

solution

:def

getintersectionnode

(self, heada: listnode, headb: listnode)

-> listnode:

ifnot heada or

not headb:

return

none

a = heada

b = headb

while a != b:

ifnot a:

a = headb

else

: a = a.

next

ifnot b:

b = heada

else

: b = b.

next

return a

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。

說明:不允許修改給定的鍊錶。

快慢指標:設定快慢指標,都從煉表頭出發,快指標每次走兩步,慢指標一次走一步,假如有環,一定相遇於環中某點(結論1)。

接著讓兩個指標分別從相遇點和煉表頭出發,兩者都改為每次走一步,最終相遇於環入口(結論2)。

證明結論1:設定快慢指標fast和low,fast每次走兩步,low每次走一步。假如有環,兩者一定會相遇(因為low一旦進環,可看作fast在後面追趕low的過程,每次兩者都接近一步,最後一定能追上)。

證明結論2:

設:煉表頭到環入口長度為–a

環入口到相遇點長度為–b

相遇點到環入口長度為–c

則:相遇時

快指標路程=a+(b+c)k+b,k>=1 其中b+c為環的長度,k為繞環的圈數(k>=1,即最少一圈,不能是0圈,不然和慢指標走的一樣長,矛盾)。

慢指標路程=a+b

快指標走的路程是慢指標的兩倍,所以:(a+b)*2=a+(b+c)k+b

化簡可得:

a=(k-1)(b+c)+c這個式子的意思是:煉表頭到環入口的距離=相遇點到環入口的距離+(k-1)圈環長度。其中k>=1,所以k-1>=0圈。所以兩個指標分別從煉表頭和相遇點出發,最後一定相遇於環入口。

演算法如下:

class

solution

:def

detectcycle

(self, head: listnode)

-> listnode:

ifnot head:

return

none

fast = head

slow = head

hascycle =

false

while fast and fast.

next

: slow = slow.

next

fast = fast.

next

.next

if slow == fast:

hascycle =

true

break

ifnot hascycle:

return

none

slow = head

while slow != fast:

slow = slow.

next

fast = fast.

next

return slow

鍊錶是否相交,鍊錶是否有環問題

1 乙個單鏈表,判斷是否有環,環的入口節點 分析 兩個指標,慢指標一次走一步,快指標一次走兩步,如果有環肯定會相交 listnode pnode bool i istloop listnode head return false 找出環的入口 環入口到相遇點為x,從開始到環入口點長度為a,環長為r,...

鍊錶有環和相交問題

問題1 這是一道演算法題,判斷乙個鍊錶是否有環,相應輸出true或者false。那怎麼考慮這個問題呢?首先想到的是遍歷鍊錶,有環與無環的區別在於,無環時遍歷會最終停止,而有環則會進入死迴圈,重複遍歷環內節點。因此可以借助於判斷節點是否第二次訪問來判斷有無環。具體做法有以下幾種 1 雜湊解法。使用乙個...

相交鍊錶 鍊錶

題目 編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 在節點 c1 開始相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3 輸出 reference of the node with v...