環形鍊錶I 與 環形鍊錶II(非常容易理解)

2021-09-13 14:12:25 字數 2498 閱讀 2438

環形鍊錶i

題目描述:

給定乙個鍊錶,判斷鍊錶中是否有環。

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

示例 1:

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

輸出:true

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

示例 2:

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

輸出:true

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

示例 3:

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

輸出:false

解釋:鍊錶中沒有環。

高階:

你能用 o(1)(即,常量)記憶體解決此問題嗎?
解題思路:雙指標法。乙個快指標,乙個慢指標。快指標一次走兩步,慢指標一次走一步。若有環,快指標一定會追趕上慢指標。若無環,快指標最先走至鍊錶末尾。

**實現:

public boolean hascycle(listnode head) 

} return false;

}

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

解釋:鍊錶中沒有環。

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

解題思路:

這裡借用另一篇部落格的乙個圖以及解題思路。

這張圖什麼意思呢?假設快指標和慢指標在c點相遇了。則快指標走過的路程為(x+y+z+y),而慢指標走過的路程為(x+y)。由於快指標走過的路程是慢指標走過路程的2倍,則有以下等式:

x+y+z+y = 2(x+y),化簡得到:x=z

所以,將任意乙個指標放置c點,另乙個指標放置原點a,並且設定兩個指標的遍歷速度相同,則兩指標相遇的結點即為開始入環的第乙個結點。

沿用上一題的解題思路。先用快慢指標判斷是否有環的存在。若不存在,直接返回空;若存在,則使用上述方法找到入口結點。

**實現:

public listnode detectcycle(listnode head) 

listnode x = hascycle(head);

if (x == null) else

return p;}}

//此方法判斷有無環。若有環,返回快慢指標相交結點,若無環,返回空

public listnode hascycle(listnode head)

} return null;

}

鍊錶 環形鍊錶 II

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

環形鍊錶 II

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

環形鍊錶II

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