快慢指针介绍及功能:
https://blog.youkuaiyun.com/qq_21815981/article/details/79833976
https://www.jianshu.com/p/21b4b8d7d31b



问题转换为142题。那么针对此题,快、慢指针该如何走呢。根据上述数组转链表的映射关系,可推出
142题中慢指针走一步slow = slow.next ==> 本题 slow = nums[slow]
142题中快指针走两步fast = fast.next.next ==> 本题 fast = nums[nums[fast]]

struct ListNode *detectCycle(struct ListNode *head) {
if (!head) {
return NULL;
}
struct ListNode * slow = head;
struct ListNode * fast = head;
while(fast != NULL && fast->next != NULL) {
fast = fast->next->next;
slow = slow->next;
if(fast == slow) {
break;
}
}
if(fast == NULL || fast->next == NULL) {
return NULL;
}
struct ListNode *ptr1 = head;
struct ListNode *ptr2 = fast;
while(1) {
if (ptr2 == ptr1) {
return ptr2;
}
ptr1 = ptr1->next;
ptr2 = ptr2->next;
}
}

int findDuplicate(int* nums, int numsSize){
if(!nums || numsSize <= 1) {
return 0;
}
int slow = 0;
int fast = 0;
int i = 0;
while(i < numsSize) {
slow = nums[slow];
int tmp = nums[fast];
fast = nums[nums[fast]];
//printf("%d %d %d \n", slow, tmp, fast);
if(slow == fast) {
break;
}
i++;
}
//printf("at last:%d %d \n", slow, fast);
i = 0;
int jmp1 = 0;
int jmp2 = fast;
while (i++ < numsSize) {
jmp1 = nums[jmp1];
jmp2 = nums[jmp2];
if(jmp1 == jmp2) {
return jmp1;
}
}
return 0;
}
本文详细介绍了快慢指针技术在解决环形链表检测及数组中查找重复元素问题的应用。通过具体算法实现,展示了如何利用快慢指针高效定位循环起点及重复项。适合对数据结构和算法感兴趣的读者。
2138

被折叠的 条评论
为什么被折叠?



