https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&&tqId=11208&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
https://blog.csdn.net/weixin_41999706/article/details/89235383?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
# write code here
'''
#方法1
hashset=[]
while pHead != None:
if pHead in hashset:
break
hashset.append(pHead)
pHead=pHead.next
return pHead
'''
#方法2:双指针
#第1步:快慢指针判断是否有环
fast=pHead
slow=pHead
ring_flag=False
while fast!=None and fast.next!=None:
fast=fast.next.next
slow=slow.next
if fast==slow: #相遇即有环
ring_flag=True
break
if not ring_flag:
return None
#第2步:计算环的长度
ring_length=1
fast=fast.next
while fast!=slow:
ring_length+=1
fast=fast.next
#第3步:双指针找到环的入口
fast=pHead
slow=pHead
for i in range(ring_length):
fast=fast.next
while fast!=slow:
fast=fast.next
slow=slow.next
return fast