(漫画算法也有这道题)
- 用快慢指针判断有没有环
- 若有,返还相遇的指针,此时指针必定相遇在环中
- 遍历环,得到环的数目n
- 一个指针先走n步,另一个指针再开始走(它们的速度相同),它们相遇的地方就是入口
解释4:
假设入口到环的入口结点距离k,当后走的指针移动k步到达入口结点时,先走的指针移动距离
为n+k,刚好多走了一个环的距离,所以又移动到了入口结点,此时两指针相遇
class Solution:
def EntryNodeOfLoop(self, pHead):
# write code here
#判断是否有环,以及得到相遇节点
meetingNode = self.MeetingNode(pHead)
if not meetingNode:
return None
#得到环节点的数目
nodenum = 1
pNode = meetingNode
while pNode.next != meetingNode:
pNode = pNode.next
nodenum += 1
#寻找入口结点
pNode1 = pHead
for i in range(nodenum):
pNode1 = pNode1.next
pNode2 = pHead
while pNode1 != pNode2:
pNode1 = pNode1.next
pNode2 = pNode2.next
return pNode1
def MeetingNode(self, pHead):
if not pHead:
return False
fast = pHead
slow = pHead
while fast and fast.next and fast.next.next:
fast = fast.next.next #之前写错成fast= phead.next.next
slow = slow.next
if fast == slow:
return fast
return False
京公网安备 11010502036488号