题目描述
判断给定的链表中是否有环
扩展:
你能给出空间复杂度的解法么?
题解:
在这介绍一个简便的方法:快慢指针
就是:一个指针走两步,一个指针走一步
快慢指针中,因为每一次移动后,快指针都会比慢指针多走一个节点,所以他们之间在进入环状链表后,不论相隔多少个节点,慢指针总会被快指针赶上并且重合,此时就可以判断必定有环。
如果快指针到达NULL,说明链表以NULL为结尾,没有环
为什么要这样?
如果两个指针只走一步,那就有可能完美错开,无法相遇,所以要造成速度差,使得能相遇
除了能找环,还可以用来找环入口,这里就不细讲了
代码:
/** * 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) {
ListNode *l1=head;
ListNode *l2=head;
while((l1!=NULL)&&(l1->next!=NULL))
{
l2=l2->next;
l1=l1->next->next;
if(l2==l1)return 1;
}
return 0;
}
};