这道题是Linked List Cycle的拓展,如图,相遇点为Linked List Cycle中的相遇点:
第一次相遇时:
慢指针移动了d+t
快指针移动了d+t+Kr (K表示某个正整数)
由于慢指针速度是快指针的1/2,所以2(d+t) = d+t+Kr,即d+t = Kr,即d = Kr - t
从第一次相遇点开始移动Kr-t的距离,恰好到cycle开始的位置,因此设置两个指针,第一个指针从第一次相遇点开始,第二个指针从列表开始的位置起,每次均移动一步,当它们相遇的时候恰好再cycle开始的位置。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head:
return None
slow = head
fast = head
while True:
slow = slow.next
if not fast.next or not fast.next.next:
return None
fast = fast.next.next
if slow == fast:
break
fast = head
while fast != slow:
slow = slow.next
fast = fast.next
return fast