题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
要求:空间复杂度为 O(1)
思路
用两个指针,快指针一次走两步,慢指针一次走一步。如果有环,他们一定会相遇
相遇后,可以通过固定一个指针,移动另一个指针,获得环的长度 n
然后将两个指针都指向头,快指针先走 n 步,然后慢指针再走。两个指针都是一次走一步,则会在环开始的地方相遇。
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
import collections
class Solution:
def EntryNodeOfLoop(self, pHead):
if not pHead:
return None
slow = pHead.next
fast = pHead.next
if fast:
fast = fast.next
else:
return None
while slow and fast:
if slow != fast:
slow = slow.next
fast = fast.next
if fast:
fast = fast.next
else:
return None
else:
break
if fast and slow:
# 找到圈的长度
n = 1
slow = slow.next
while slow!=fast:
slow = slow.next
n += 1
slow = pHead
fast = pHead
for i in range(n-1):
fast = fast.next
while fast != slow:
slow = slow.next
fast = fast.next
return fast
else:
return None