我们这里用一道题目为例子给大家讲解
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode* head) {
ListNode *fast = head, *slow = head;
while (fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
if (fast == slow) {
return true;
}
}
return false;
}
我们大致可以看出只需要一个快慢指针去让他们不停的的跑,能够相遇就是链表中有环,如果相遇不到就没有环。
如果快指针每次走三次或多次,那么有没有今年他们一直都遇不到呢?
我们用这里面用数学的思维来判断,假设圈的长度为C,在慢指针进入圈的时候两个指针的距离为N。
我们可以知道
、
我们知道慢指针每走一次,快指针走三次。
慢指针的距离是L
假设快指针在圈里面走了x次
3L =L+x*c+c-N
可以化简为
2L =x*c+c-N也是
2L=(X+1)*c-N
左边一定为偶数,右边也要是偶数
所以无法N和C为不同的数,由此可知他们一定会相遇。
结论