文章目录
- 一、题目
- 二、思路
- 三、代码
一、题目
https://leetcode.cn/problems/linked-list-cycle-ii/description/
二、思路
总体是两次相遇解决
首先,快指针速度2,满指针速度1,lenf=2 lens
其次,相遇时,lenf=lens+nb
由以上两式可得,s=nb
从head开始到入环结点要走a +nb,slow已经走了nb,那么slow再走a步就能到入环点。
怎么让slow刚好走a步呢 ❓
让fast回到head开始和slow重新走,相遇时刚好是a步
(a是从head到入环点的距离,b是环一圈的长度)
三、代码
// Definition for singly-linked list.
//struct ListNode {
// int val;
// ListNode *next;
// ListNode(int x) : val(x), next(NULL) {}
//};
class Solution {
public:
ListNode* detectCycle(ListNode* head) {
ListNode* fast = head;
ListNode* low = head;
int flag = 0;
while (fast && fast->next) {
fast = fast->next->next;//这里要调用first->next,while中应该判断这个也不为空
low = low->next;
if (fast == low) {
fast = head;
while(fast!=low){
fast = fast->next;
low = low->next;
}
return low;
}
}
return NULL;
}
};