快慢指標概念
快慢指標中的快慢指的是移動的步長,即每次向前移動速度的快慢。例如可以讓快指標每次沿連結串列向前移動2,慢指標每次向前移動1次。
快慢指標找連結串列環相關理論
- 快指標必然與慢指標相遇
- 慢指標進入環後,快指標最多多繞一個圈
- 若在頭結點和相遇結點分別設一指標,同步(單步)前進,則最後一定相遇在環入口結點
- 找到連線點p後,求head到p的長度,再加上環的長度,即為連結串列的總長
應用案例
問題:給定一個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在一個重複的整數。假設只有一個重複的整數,找出這個重複的數。
class Solution {
/**
快慢指標思想, fast 和 slow 是指標, nums[slow] 表示取指標對應的元素
注意 nums 陣列中的數字都是在 1 到 n 之間的(在陣列中進行遊走不會越界),
因為有重複數字的出現, 所以這個遊走必然是成環的, 環的入口就是重複的元素,
即按照尋找連結串列環入口的思路來做
**/
public int findDuplicate(int[] nums) {
int slow = nums[0]; //注意,這裡的起始是第一個數字
int fast = nums[0];
while(true){
slow = nums[slow];
fast = nums[nums[fast]];
if(slow == fast){
fast = nums[0]; //這裡也是從第一個數字開始
while(slow != fast){ //兩個下標相等,此時是兩個指標第二次相遇的前一個位置,下一時刻就會相遇,返回此時的下標就是重複的數字
slow = nums[slow];
fast = nums[fast];
}
return slow;
}
}
}
}
複製程式碼