// 寻找重复数
// 输入:nums = [1,3,4,2,2]
// 输出:2
// 链表的环,重复元素为环的起点
// 2(a+b)=a+b+kL
// a起点到环口的距离
// b环口到相遇点的距离
// l环的长度
// 慢指针a+b
// 快指针2*(a+b)= a+b+kl
// a=(kl-b=c)
// 慢指针走a,快指针走c相遇
public static int findDuplicate(int[] nums){
int slow=0;
int fast=0;
slow=nums[slow];
fast=nums[nums[fast]];
// 在环上相遇,找到相遇点,快指针=2倍的慢指针
while (slow!=fast){
slow=nums[slow];
fast=nums[nums[fast]];
}
// 第一次相遇的点到环口的距离=慢指针从起点到环口的距离。相同速度在相遇即是重复元素
int pre1=0;
int pre2=slow;
while (pre1!=pre2){
pre1=nums[pre1];
pre2=nums[pre2];
}
return pre1;
}