题目如下:
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
题目分析:
最常见的想法是遍历linked list,同时用个set进行记录遍历过的节点,如果遍历linked list时发现当前节点已经在set中出现过了。那就说明成环了。set将使用O(N)的空间复杂度。
但是,题目要求不用extra space。所以可以考虑两个指针first, second在linked list上遍历,一个跑得快,一个跑得慢。如果linked list成环,那么慢指针终将被快指针追上。
我的代码:
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode* first=head;
ListNode* second=head;
while(first!=NULL&&second!=NULL&&second->next!=NULL){ //注意这个条件判断不能写漏了。
first=first->next;
second=second->next->next;
if(first==second)
return true;
}
return false;
}
};