Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
/**
* 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) {
/*
1. 空链表不成环
2. 一个节点自环
3. 一条链表完整成环
*/
if(head==NULL)return false;
if(head->next==NULL)return false;
if(head->next==head)return true;
ListNode* y=head->next;
ListNode* x=head->next->next;
while(x!=NULL && y!=NULL)
{
x=x->next;
if(x==NULL)break;
x=x->next;
y=y->next;
if(x==y)break;
}
return x==y;
}
};
标准做法是使用两个指针,一个每次往前走2步,一个每次往前走1步,如果两个指针相遇,即说明链表有环,时间复杂度为O(N),空间复杂度为O(1)。