【Floyd判圈法】LeetCode 142. 环形链表 II
题目
https://leetcode.cn/problems/linked-list-cycle-ii/description/
题解
用快慢指针的思路进行思考,不妨设 \(p\) 为慢指针,每次移动一步,\(q\) 为快指针,每次移动两步,且初始状态均处于头节点 \(head\) 的位置。
若链表无环,易知快指针 \(q\) 最终会变为 NULL。
若有环,则慢指针 \(p\) 和快指针 \(q\) 必定会在某个节点相遇。此时让其中一个指针再次指向头节点 \(head\) 的位置,然后让快慢指针都以每次移动一步的速度进行移动,再次相遇的节点就是环的入口结点。
参考代码
/**
* 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* p = head, *q = head;
while (q && q -> next) {
p = p -> next;
q = q -> next -> next;
if (p == q) break;
}
if (!q || !q -> next) return NULL;
q = head;
while (q != p) {
p = p -> next;
q = q -> next;
}
return q;
}
};
浙公网安备 33010602011771号