劍指offer 面試23題

2022-04-23 00:51:09 字數 1887 閱讀 3883

面試23題:

題目:如果乙個鍊錶中包含環,如何找出環的入口節點?

解題分析:其實此題可以分解為三個題目:1)如何判斷乙個鍊錶中是否包含環?2)如何找到環的入口節點?3)如何得到環中節點的數目?

解決此題:可以設定兩個指標,一快一慢。

1.兩個指標乙個fast、乙個slow同時從乙個鍊錶的頭部出發

fast一次走2步,slow一次走一步,如果該鍊錶有環,兩個指標必然在環內相遇,(如果相遇就證明此鍊錶包含環,否則沒有環,解決問題1)

2.1 此時只需要把其中的乙個指標重新指向鍊錶頭部,另乙個不變(還在環內),

這次兩個指標一次走一步,相遇的地方就是入口節點(解決問題2,得到環的入口節點)。

2. 2  接著步驟1,如果兩個指標相遇,必然在環內,所以可以從這個節點出發,一遍繼續向前移動,一遍計數,當再次回到這個節點時,就可以得到環中節點數了(解決問題3,得到環中節點數目)

證明方法:見

解題**:

#

-*- coding:utf-8 -*-

class

listnode:

def__init__

(self, x):

self.val =x

self.next =none

class

solution:

defentrynodeofloop(self, phead):

pfast=phead

pslow=phead

while pfast!=none and pfast.next!=none:

pfast=pfast.next.next

pslow=pslow.next

#兩個指標相遇且非空,則說明有環

if pfast==pslow:

break

if pfast==none or pfast.next==none:

return

none

pfast=phead

while (pfast !=pslow):

pfast =pfast.next

pslow =pslow.next

#返回環的入口節點

return pfast

如果另需求環中節點的個數,可以更改**為:

#

-*- coding:utf-8 -*-

class

listnode:

def__init__

(self, x):

self.val =x

self.next =none

class

solution:

defentrynodeofloop(self, phead):

pfast=phead

pslow=phead

while pfast!=none and pfast.next!=none:

pfast=pfast.next.next

pslow=pslow.next

#兩個指標相遇且非空,則說明有環

if pfast==pslow:

break

if pfast==none or pfast.next==none:

return

none

meetingnode=pfast

nodesinloop=1

while(pfast.next!=meetingnode):

pfast=pfast.next

nodesinloop+=1

#返回環中節點數目

return nodesinloop

劍指offer 面試35題

面試35題 題目 複雜鍊錶的複製 題 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路一 python作弊法 解題 coding ...

劍指offer 面試33題

面試33題 題 二叉搜尋樹的後序遍歷序列 題目 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。解題思路 遞迴 解題 coding utf 8 class solution defverifysquenceof...

劍指offer 面試31題

面試31題 題目 棧的壓入 彈出元素 題 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出...