每日一題 142 環形鍊錶 II

2021-10-08 00:13:32 字數 1274 閱讀 8806

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。

難度:mid

本題在面試**現的頻率較高,需特別注意下。常見的解法有兩種:

1.使用hashset儲存listnode引用,依次遍歷整個鍊錶。若當前節點

未在hashset出現過,則將其加入set中,繼續遍歷下一節點。

若已經在set中存在,則表示找到入口,直接返回。

該方法時間複雜度o(n),空間複雜度o(n)

public

class

solution

visited.

add(node)

; node = node.next;

}return null;

}}

2.第二種方法要用數學公式推導,一下子比較難想到。但是有同學在招銀網路的面試中被問到了該方法的數學推導過程,所以還是掌握一下吧。

做法:該方法使用快慢指標,快指標每次走兩步,慢指標每次走一步。如果存在環,則兩指標一定會相遇。第一次相遇後,將快指標從新移到表頭,後續快慢指標都每次都只走一步,直到第二次相遇,直接返回相遇節點位置。

推導:在第一次相遇之前,設快指標走過的步數 為f,慢指標走過的步數為s。有關係式:f = 2s。設煉表進入環之前的長度為a,環長度b。快慢指標第一次相遇時,快指標一定比慢指標多走了n圈,即f= s + n×b 。 由前兩個關係式可知,s = nb。即在第一次相遇時,慢指標已經走過了nb步。(關鍵

又由於從頭節點處開始,走a +n×b步,一定會走到環入口位置。所以只需讓乙個節點回到頭部,另乙個節點從第一次相遇位置出發,這兩個節點即可同時走到入口位置,完成第二次相遇。這樣也就找到了環的入口位置。

該方法時間複雜度o(n),空間複雜度o(1)

public

class

solution

fast = fast.next.next;

slow = slow.next;

if(fast == slow)

break;}

slow = head;

while

(slow != fast)

return fast;

}}

142 環形鍊錶 II

還是快慢指標的問題,當發現有環時,將fast指向head,fast一次向前移動乙個節點,則fast和slow一定會在環的入口相遇.證明 設s為slow指標走的節點個數,m為環的入口距head的位置 則第一次相遇時,fast和head相對於環入口的位置相同,fast在環中的相對於環入口的位置在 2s ...

142 環形鍊錶 II

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。高階 你是否可以不用額外空間解決此題?definition for singly linked list.struct listnode class solution node set.insert...

142 環形鍊錶 II

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。示例 1 輸入 head 3,2,0,4 pos 1 輸出...