Day 7 142 環形鍊錶 II

2021-10-09 05:02:30 字數 1663 閱讀 2397

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

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

說明:不允許修改給定的鍊錶。

示例 1:

輸入:head = [3,2,0,-4], pos = 1

輸出:tail connects to node index 1

解釋:鍊錶中有乙個環,其尾部連線到第二個節點。

示例 2:

輸入:head = [1,2], pos = 0

輸出:tail connects to node index 0

解釋:鍊錶中有乙個環,其尾部連線到第乙個節點。

示例 3:

輸入:head = [1], pos = -1

輸出:no cycle

解釋:鍊錶中沒有環。

高階:你是否可以不用額外空間解決此題?

方法一:雜湊

public listnode detectcycle

(listnode head)

else

head = head.next;

}return null;

}

思路:跟判斷判斷鍊錶是否有環一樣,如果當前節點已經在hashset裡了,當前節點就是入環的第乙個節點。

方法二:雙指標

public listnode detectcycle

(listnode head)

slow = slow.next;

fast = fast.next.next;

if(slow == fast)

} fast = head;

while

(slow != fast)

return slow;

}

思路:假設起點到環入口點的距離為a,環的長度的b,快指標fast每次走兩步,慢指標slow每次走一步,如果沒有環,fast走到尾部返回null就行了。

有環的情況下,第一次相遇,得出以下公式:

f = 2s,

f = s + nb(重要),f一定比s多走n個環才會相遇。

結合兩條公式得出f = 2nb,s=nb。

如果乙個點想要走到環的入口處,那麼步數一定是k = a + nb,而f,s第一次相遇s走了nb步,所以只有s再走a步即可到達環的入口。

這時將fast重置為head節點,f 和 s 走 a 步就會第二次相遇,此時的節點就是環的入口點。

這類鍊錶題目一般都是使用雙指標法解決的,例如尋找距離尾部第k個節點、尋找環入口、尋找公共尾部入口等。

嘗試使用遞迴的方法失敗了,超時。

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 輸出...