题目描述
一个链表中包含环,请找出该链表的环的入口结点。
# -*- coding:utf-8 -*- class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def EntryNodeOfLoop(self, pHead): # write code here meet_node=self.MeetNode(pHead) if meet_node == None: return None loop_node=1 p1=meet_node while p1.next!=meet_node: loop_node += 1 p1=p1.next p1=pHead for i in range(loop_node): p1=p1.next p2=pHead while p1!=p2: p1=p1.next p2=p2.next return p1 def MeetNode(self,pHead): if pHead==None: return None slow=pHead.next if slow==None: return None fast=slow.next while fast!=None and slow!=None: if slow==fast: return slow slow=slow.next fast=fast.next if slow!=fast: fast=fast.next return None
按照书上的方法完成,相当于重写了c++代码。利用两个指针,先找到环内节点,在找到环的长度,最后找到环的入口。
链接:https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4
来源:牛客网
解法:
第一步,先找到环中的一个节点(找到之后就可以计算出环中的节点数目)
让一个指针fast走快一点,一个指针slow走慢一点;当fast与slow相遇时,即fast比slow多一圈,此时相遇的节点肯定是环内的节点
第二步,根据环中的节点来计算环中节点总数
从此节点遍历到此节点结束,即可得到节点总数
第三步,知道了环内节点总数,来找到环入口
先让一个指针p1从根节点开始往后走m步,然后再让一个节点p2指向头结点;
然后让p1和p2同时往后移动,当p1与p2相交时,此时的点就是环的入口节点