142. 环形链表 II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
说明:不允许修改给定的链表。
进阶:
你是否可以不用额外空间解决此题?
设环的长度为z,n表示在快的跑到了(x + y)之后在环形上跑的圈数,head到入口的长度为x, 环的入口到第一次相遇的位置的长度为y。
第一次相遇
快的跑了(x + y + n * z), 慢的跑了(x + y)
而 x + y + n * z = 2*(x + y)。
所以:x + y = n * z
结论是:x = n * z - y
# 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
"""
fast = slow = head
while fast and fast.next:
fast = fast.next.next
slow = slow.next
if fast is slow:
break
else:
return
slow = head
while slow is not fast:
slow = slow.next
fast = fast.next
return slow