快慢指针可以在O(1)的常数内存空间里完成链表环形判断,时间复杂度是O(n)。思路大概是 慢指针每次前进一步,快指针前进两步,党慢指针走完环形一圈时,快指针刚好走完两圈,两个指针相遇,则判断有环。
#include<stdio.h>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
bool hasCycle(ListNode *head) {
if (head == NULL)
return false;
ListNode *slow = head, *fast = head;
if (head->next == NULL || head->next->next == NULL)
return false;
slow = head->next;
fast = head->next->next;
while (slow != fast) {
if (slow->next == NULL || fast->next == NULL || fast->next->next == NULL)
return false;
slow = slow->next;
fast = fast->next->next;
}
return true;
}
};