# -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def EntryNodeOfLoop(self, pHead): # 这道题相当于是寻找两个链表的公共节点的变体, # 首先先用快慢指针找到环内的一个节点, # 然后用双指针,一个从链表头开始遍历,一个从找到的环内节点开始遍历,这样就可以找到原始链表和环之间的公共节点的头节点。 # 原始链表和环之间的公共节点就是整个环,所以原始链表和环之间的公共节点的头节点就是环的入口。 slow = pHead fast = pHead # 标记该链表是否有环。 is_circular = False # 用快慢指针找到环中的一个节点,判断一下fast.next是为了防止fast.next.next出现越界。 while slow and fast and fast.next: # 慢指针每次走一步。 slow = slow.next # 快指针每次走两步。 fast = fast.next.next if slow == fast: is_circular = True break # 遍历原始链表和环(此处的环内节点可以用slow和fast任意一个来表示),公共节点的头节点就是环的入口。 while pHead and slow and is_circular: if pHead != slow: pHead = pHead.next slow = slow.next else: return pHead return None