23.链表中环的入口节点 | python
链表中环的入口结点
http://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4
(漫画算法也有这道题)
- 用快慢指针判断有没有环
- 若有,返还相遇的指针,此时指针必定相遇在环中
- 遍历环,得到环的数目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