給定一個鏈表,返回鏈表開始入環的第一個節點。 若是鏈表無環,則返回 null。node
爲了表示給定鏈表中的環,咱們使用整數 pos 來表示鏈表尾鏈接到鏈表中的位置(索引從 0 開始)。 若是 pos 是 -1,則在該鏈表中沒有環。數據結構
說明:不容許修改給定的鏈表。ide
示例 1:idea
輸入:head = [3,2,0,-4], pos = 1
輸出:tail connects to node index 1
解釋:鏈表中有一個環,其尾部鏈接到第二個節點。spa
示例 2:3d
輸入:head = [1,2], pos = 0
輸出:tail connects to node index 0
解釋:鏈表中有一個環,其尾部鏈接到第一個節點。指針
示例 3:code
輸入:head = [1], pos = -1
輸出:no cycle
解釋:鏈表中沒有環。blog
進階:
你是否能夠不用額外空間解決此題?索引
idea:fast,slow從head出發步長分別爲2和1,第一次相遇讓slow不動,fast從head開始,步長都變爲1,第二次相遇的地方即爲入環的第一個節點
證實
假設非環部分的長度是x,從環起點到相遇點的長度是y。環的長度是c。
如今走的慢的那個指針走過的長度確定是x+n1*c+y,走的快的那個指針的速度是走的慢的那個指針速度的兩倍。這意味着走的快的那個指針走的長度是2(x+n1*c+y)。
還有一個約束就是走的快的那個指針比走的慢的那個指針多走的路程必定是環長度的整數倍。根據上面那個式子能夠知道2(x+n1*c+y)-x+n1*c+y=x+n1*c+y=n2*c。
因此有x+y=(n2-n1)*c,這意味着什麼?咱們解讀下這個數學公式:非環部分的長度+環起點到相遇點之間的長度就是環的整數倍。這在數據結構上的意義是什麼?如今咱們知道兩個指針都在離環起點距離是y的那個相遇點,而如今x+y是環長度的整數倍,這意味着他們從相遇點再走x距離就剛剛走了不少圈,這意味着他們若是從相遇點再走x就到了起點。
那怎麼才能再走x步呢?答:讓一個指針從頭部開始走,另外一個指針從相遇點走,等這兩個指針相遇那就走了x步此時就是環的起點。
1 # Definition for singly-linked list. 2 # class ListNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 7 class Solution(object): 8 def detectCycle(self, head): 9 """ 10 :type head: ListNode 11 :rtype: ListNode 12 """ 13 fast,slow=head,head 14 while True: 15 if not fast or not fast.next:return 16 fast,slow = fast.next.next,slow.next 17 if fast == slow:break 18 fast = head 19 while fast!=slow: 20 fast,slow=fast.next,slow.next 21 return fast