# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def EntryNodeOfLoop(self, pHead):
# write code here
#先判断是不是有环,用快慢指针(一个正常走,一个每次走两步),如果有环必然会相遇
if pHead == None:
return None
meetingnode = self.MeetingNode(pHead)
if meetingnode == None:#如果判断无交点的的情况
return None
nodeslop = 1
node1 = meetingnode #如果有交点,返回交点就够了。环的节点数比运行次数多1
while node1.next != meetingnode:
node1 = node1.next
nodeslop += 1
node1 = pHead #原链表一直没动
for i in range(nodeslop):#两个指针开始走,当先让一个指针走环内节点数的步数时,另一个节点再走,此时相遇的点恰好是成环第一个节点
node1 = node1.next
node2 = pHead
while node1 != node2:
node1 = node1.next
node2 = node2.next
return node1
def MeetingNode(self, pHead):
slow = pHead.next
if slow == None:
return None
fast = slow.next
while fast != None:
if slow == fast:
return fast
slow = slow.next
fast = fast.next
if fast != None: #不是循环只会运行一次
fast = fast.next
return None