给定一个链表,判断链表中是否有环。
进阶:
你能否不使用额外空间解决此题?
优化后解法:
//主要通过判断是否遇到链表尾,是的话提前结束循环;
//优化时间:16ms->8ms
class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==NULL||head->next==NULL) return false;
ListNode *fast=head;
ListNode *slow=head;
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
if(head==NULL||head->next==NULL) return false;
if(fast==slow) return true;
}
return false;
}
};
原答案:
这道题的思路有两种,一种是使用哈希表,另一种是使用快慢指针;下面是快慢指针的解法:
//快指针每次比慢指针多走一步,那么如果有环的情况下,
//一定会在某一个节点,快指针超过慢指针整整一圈
/**
* 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 *fast=head;//快指针
ListNode *slow=head;//慢指针
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
if(fast==slow) return true;
}
return false;
}
};