Leetcode 142. Linked List Cycle II
题目
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路:
head 头节点
E 入口节点
X 首次相遇节点
a 头节点到入口节点距离
H 第一次相遇节点到入口节点的距离
c 环长
慢指针一次一步,快指针一次两步,第一次相遇时,慢指针走了n步,快指针走了2n步,也就是说,第一次相遇时快指针比慢指针多走了一圈c。
即: 2n = n + c
推出: n=c
也就是说,慢指针走了一个环长c
我们知道,链表的长度等于a+c。对于慢指针来说,已经走了一个环长c,它剩下没走完的距离,就是相遇点到入口点的那段距离H。将快指针重置在头节点处,快慢指针一起,手拉手一步一步地走,再次相遇的地方就是入口节点!
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head == None or head.next == None:
return None
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
fast = head
while slow != fast:
slow = slow.next
fast = fast.next
return slow
return None