面试常考:成环法的应用--寻找环的起点得到重复的数字
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试常考:成环法的应用--寻找环的起点得到重复的数字相关的知识,希望对你有一定的参考价值。
题目
做这题之前需要了解的题目
原理是通过快慢指针判断是否有环,然后通过距离关系,从头同步遍历找到起点。
解题代码
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
//只需要判断fast指针是否null就行,毕竟在最前面
ListNode* slow = head;
ListNode* fast = head;
//在环内相交,然后通过距离关系,得到环的起点
while(fast&&fast->next){
slow = slow->next;
fast = fast->next->next;
if(slow==fast)
goto end;
}//用goto区别有环和无环
return nullptr;
end:
slow = head;
while(slow!=fast){
//通过距离关系,同步运行得到交点
slow = slow->next;
fast = fast->next;
}
return slow;
}
};
题目解析
这次我就偷个懒,给个链接给你们看看大佬的解析。
这题难就难在要实现O(n)时间复杂度的同时还要求O(1)的空间复杂度。
此题能将数组作为链表处理而且一旦出现重复元素就能成环的原因
:因为是给定n+1个元素,元素的数据范围在1~n,并且只存在一个重复的元素值(该值可为多次)
解题代码
class Solution {
public:
//代码风格几乎和链表那题惊人的一致,只是这个不需要考虑边界问题,所以直接可以走步
int findDuplicate(vector<int>& nums) {
int slow = 0,fast = 0;
//走一步 和 走两步
slow = nums[slow]; fast = nums[nums[fast]];
//不用考虑边界问题的快乐hhh,直接可以判断是否相等
while(slow!=fast){
slow = nums[slow];
fast = nums[nums[fast]];
}//更改慢指针,同步找起点
slow = 0;
while(slow!=fast){
slow = nums[slow];
fast = nums[fast];
}
return slow;
}
};
以上是关于面试常考:成环法的应用--寻找环的起点得到重复的数字的主要内容,如果未能解决你的问题,请参考以下文章