面試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就不可能是該壓棧序列的彈出...