题目链接
题目描述(Description)
Linked List Cycle
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
链表是否有环
给你一个链表,判断它是否有环?
进一步:
你能在不使用额外空间解决这个问题吗?
分析(Analysis)
由两个人在圆形操场跑步引发的思路:如果两个人同一起点同时开始跑步,由于操场是圆形的,且一人速度快一人速度慢,那么在有限时间内,跑的快的人总能遇上跑的慢的人。
在此题中,设置两个指针
slow
、fast
,slow
每次走一步,fast
每次走两步,如果链表存在环,那么总能出现slow==fast
,注意这里fast->next->next
存在的前提是fast->next!=NULL
,而fast->next
存在的条件是fase!=NULL
,这两个作为继续追赶(循环)的判断条件。如果链表为空,返回
false
。
代码(Code)
空间复杂度O(1)
/**
* 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) {
if(!head)
return false;
ListNode *slow=head,*fast=head;
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
return true;
}
return false;
}
};