题目描述 :
给你一个链表的头节点 head
,判断链表中是否有环。
接口:
bool hasCycle(struct ListNode *head)
示例1:
示例2:
返回值:
true或false
思路
使用快慢指针:
快的追慢的,如果有环,在相对速度差合适的情况下就可以追得到,返回true,无环就返回false,这里我们采取速度差为1,每一次相对距离接近1,最后快的追上慢的。
实现代码
bool hasCycle(struct ListNode* head) { struct ListNode* slow = head; struct ListNode* fast = head; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; if (slow == fast) { return true; } } return false; }
该速度差为一,也就是说每次两者的距离都会靠近一,所以一定追得上,那么速度差为n时什么情况我们追不上呢?
当距离差为N,N是偶数,速度差为偶数,追得上。N是奇数,速度差为偶数就会错过,然后错过后两者的相对距离还要再次判断和计算是否为偶数,从而产生了永远也追不上的可能性。速度差为奇数也是同样的道理,这里就体现出速度差为1的好处,他一定追得上,而不用去考虑是否有可能会永远也追不上。