原题地址:https://leetcode.com/problems/linked-list-cycle-ii/description/
题目描述:
Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
Note: Do not modify the linked list.
Follow up:
Can you solve it without using extra space?
题解:首先判断是否有环,思路见上题,在判断有环后,在判断环的入口。
仍然设非环部分长度为a,环部分为b, 慢指针入环后两者相距x,寻找的就是第a+1个节点。
当慢指针走到入口处时,假设快指针已经走了r圈,即2*a = b*r+a+(b-x)=》a = b*r+(b-x) (r >=0)
所以我们再设定两个指针分别指向链表头和快慢指针相遇的位置,当前一个指针走了a步即走到环的入口的时候,第二个指针走了b-x+b*r步,正好也在环的入口,两者相遇。所以要求的就是两者相遇的位置。
# 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
"""
a = b = head
while (a is not None and b is not None):
a = a.next
b = b.next
if b is not None:
b = b.next
else:
return None
if a == b:
c = head
d = a
while (1):
if c == d:
return c
c = c.next
d = d.next
return None
16 / 16 test cases passed.
Status: Accepted
Runtime: 70 ms