https://leetcode.cn/problems/linked-list-cycle/
思想:
借助环形链表在一个环内无限循环的思想
可以借助双指针-快慢指针,快指针的步长每次比慢指针快1步
由于环的长度有限,这样的话,在环内无限循环的快指针和慢指针一定会再次相遇
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool hasCycle(ListNode *head)
{
if(head == NULL)
{
return 0;
}
ListNode *p = head; // 慢指针
ListNode *q = head->next; // 快指针
while(p != q)
{
if(q == NULL || q->next == NULL) // 如果快指针马上就能到达终点,说明没有进入环
{
return 0;
}
p = p->next; // 慢指针每次的移动步长为1
q = q->next->next; // k快指针每次的移动步长为2
}
// 若跳出循环:说明p和q相遇了,间接说明存在环,否则不可能相遇
return true;
}
};