描述
判断给定的链表中是否有环。如果有环则返回true,否则返回false。
要求:空间复杂度 O(1),时间复杂度 O(n)
解题思路
方法一:快慢指针
class Solution {
public:
bool hasCycle(ListNode *head) {
if(!head) return false;
ListNode* slow = head;
ListNode* fast = head;
while(fast!=nullptr&&fast->next!=nullptr){
slow=slow->next;
fast=fast->next->next;
if(slow==fast) return true;
}
return false;
}
};
时间复杂度:O(n),最多遍历链表的2*(X+Y)个结点,时间复杂度为O(n);
空间复杂度:O(1),需要额外两个快慢指针来遍历结点。
方法二:hash法,记录第一次重复的结点
通过使用set或者map来存储已经遍历过的结点,当出现重复的结点时,即为有环。
class Solution {
public:
bool hasCycle(ListNode *head) {
unordered_map<ListNode*, bool> m;
while(head){
if(m.find(head)!=m.end()) return true;
m[head]=true;
head=head->next;
}
return false;
}
};
时间复杂度:O(n),需要将链表的所有结点遍历一遍,时间复杂度为O(n);
空间复杂度:O(n),需要额外的n空间的hashset来存储结点。