給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出none。
思路:1.找相遇點:設定乙個快指標pfast乙個慢指標pslow,先找到乙個相遇點,一定在環中
2.計算環的長度: 從相遇點出發,到相遇點結束-1,即為環的長度。
3.pfast:從phead+環的長度出發;pslow從phead出發,當pfast=pslow時,即為入口節點。
class listnode:
def __init__(self,x):
self.val = x
self.next = none
class solution:
def meetingnode(self,phead):
""":param phead:頭節點 0
:return:
"""if phead == none:
return none
pslow = phead.next #慢指標1,每次走一步
if pslow ==none:
return none
pfast = pslow.next# 快指標2,每次走兩步
while pfast:
if pslow == pfast: # 當兩個相等的時候返回慢指標的節點 即相遇點
return pslow
pslow = pslow.next
pfast = pfast.next
if pfast:
pfast = pfast.next
def entrynodeofloop(self,phead):
meetingnode = self.meetingnode(phead) #傳入相遇的點,以這個點為起點
if not meetingnode:
return none
nodeloop = 1 # 計步器從1開始 ,當next指標指向相遇點時結束。
flagnode = meetingnode
while flagnode.next != meetingnode:
nodeloop +=1
flagnode = flagnode.next
pfast = phead # 快指標從加上步長的位置開始
for i in range(nodeloop):
pfast = pfast.next
pslow = phead # 慢指標從頭開始
while pfast != pslow: # 當兩個相遇時,即入口節點
pfast = pfast.next
pslow = pslow.next
return pfast
node1 = listnode(1)
node2 = listnode(2)
node3 = listnode(3)
node4 = listnode(4)
node5 = listnode(5)
node6 = listnode(6)
node7 = listnode(7)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5
node5.next = node6
node6.next = node7
node7.next = node3
s = solution()
print(s.entrynodeofloop(node1).val)
劍指offer23 鍊錶中環的入口節點
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。兩個指標,p1,p2 p1一次走一步,p2一次走兩步。第一次相遇之後開始計數,第二次再相遇時count的值就是環有多少個節點。兩個指標,p1,p2 p1先走count步,然後兩個再同時走,相遇的點就是入口節點。struct l...
劍指offer23 鍊錶中環的入口節點
判斷單鏈表中有沒有環,如果有找到環的入口節點。三個問題 1 如何確定鍊錶中包含環 兩個指標,乙個指標一次走一步,乙個指標一次走兩步。如果走得快的指標追上了走得慢的指標,則說明鍊錶包含環 如果走得快的指標走到了鍊錶末尾 p next null 都沒有追上第乙個指標,則無環。2 如何找到環的入口 定義兩...
劍指offer23 鍊錶中環的入口節點
題目 如果乙個鍊錶中包含環,如何找出環的入口節點?例如,在下圖所示的鍊錶中,環的入口節點是節點3。1 判斷乙個鍊錶是否包含環?可以用兩個指標來解決這個問題,定義乙個慢指標和乙個快指標,這兩個指標同時從鍊錶的頭節點出發,慢指標一次走一步,快指標一次走兩步,如果快指標追上了慢指標,說明鍊錶就包含環,如果...