LeetCode142關於快慢指標

2021-10-24 06:49:19 字數 1803 閱讀 7504

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 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

解釋:鍊錶中沒有環。

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

因為hashset只能儲存不重複的物件,利用這一特性,直接遍歷這個鍊錶,當出現重複的物件時,我們直接就找到了環形鍊錶的入口,如果遍歷結束還是沒有重複物件,那麼就說明不是環形鍊錶。

這個方法邏輯很簡單,但是建立了hashset,用了額外的空間o(n)。

public

class

solution

visited.

add(node)

; node = node.next;

}return null;

}}

快慢指標用通俗一點的說法就是平時我們在跑步時,兩個人只要不停下來,那麼跑的快的那乙個總有可能超過跑過慢的,這時他們就會相交。

如果題目給出的是環形鍊錶,那麼我設定兩個指標,乙個每次走一步稱為slow,乙個每次走兩步稱為fast,fast總會追上slow。

如果給出的不是環形鍊錶,則會遇到指標等於null的情況,此時判斷沒有環,返回null。

/**

* definition for singly-linked list.

* class listnode

* }*/public

class

solution

listnode temp = head;

while

(slow != temp)

return temp;

}}

設從head需要走 a 步到達環的入口,如果環存在的話,再走 b 步可以再次到達該入口(即環的長度為b)。

假設相遇時slow走過的長度為

s = a+x

當快慢指標相遇時,快指標已經至少走完一圈環了,不妨設相遇時走了完整的m圈(m >= 1),則fast走過

f = a + mb + x

由於快指標fast 走的路長始終是慢指標的 2倍:

f = 2s ——> f = 2mb

可以在鍊錶的開頭初始化乙個新的指標,稱其為 temp, 此時 temp距離環的入口的距離為 a,當temp和fast同時走過a步後,f = 2mb+a,fast剛好和temp在環的入口處相遇。

LeetCode142之環形鍊錶II

一 題目 二 一種解題思路 方法介紹一 龜兔賽跑法公升級版 方法解析 使用龜兔賽跑法先判斷當前鍊錶是否存在環 快慢指標能夠相遇,則存在環 假設鍊錶頭部到環起點的距離為x,環的長度為y,快指標每次走兩步,慢指標每次走一步,慢指標走t步後與快指標相遇,相遇的位置是 t x y x 2 t x y x,求...

leetcode 142 環形鍊錶

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。思路 首先通過快慢指標的方法判斷鍊錶是否有環 接下來如果有環,則尋找入環的第乙個節點。具體的方法為,首先假定鍊錶起點到入環的第乙個節點a的長度為a 未知 到快慢指標相遇的節點b的長度為 a b 這個...

leetcode 142環形鍊錶

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