佛洛依德的兔子和烏龜,環形鍊錶雙指標問題

2021-10-01 12:01:42 字數 747 閱讀 6520

leetcode287 尋找重複數

給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。

示例 1:

輸入: [1,3,4,2,2]

輸出: 2

示例 2:

輸入: [3,1,3,4,2]

輸出: 3

分析:因為長度為n+1的陣列的下標在0-n之間。

題目中給出的這個陣列的範圍在1-n之間,那麼可以把陣列中的每乙個位置存放的值看作鍊錶的next索引。

因為每個位置都放了乙個next索引,所以鍊錶肯定是成環的。

環的起點肯定是重複的next索引。

所以用雙指標,乙個快指標,乙個慢指標,如果兩個指標重合,兩個路程相減就是環的長度。再令頭指標和慢指標向前移動,如果重合就是環的起點。

class solution:

def findduplicate(self, nums: list[int]) -> int:

t=r=nums[0]

while(true):

t=nums[t]

r=nums[nums[r]]

if t==r:

break

h=nums[0]

while(t!=h):

t=nums[t]

h=nums[h]

return h

雙向鍊錶和環形鍊錶 約瑟夫問題

雙向鍊錶 package linkedlist public class dooublelinkedlistdemo 建立乙個雙向鍊錶的類 class doublelinkelist 遍歷雙向鍊錶的方法 public void list 定義輔助變數來遍歷 heronode2 temp head.n...

環形鍊錶的判斷

給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。示例 2 輸...

鍊錶的中間節點和判斷鍊錶是否為環形鍊錶

基本思想 設定兩個指標,都指向鍊錶的頭節點。兩個指標同時從鍊錶的頭節點出發,乙個指標每次走一步,另乙個指標每次走兩步。1.走得快的指標走到鍊錶末尾時,走得慢的指標剛好指向鍊錶的中間節點。2.走得快的指標如果追的上走得慢的指標,則鍊錶為環形鍊錶,反之不是。如下 include include usin...