📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
文章目录
- 牛客热题:判断链表是否有环
- 题目链接
- 方法一:快慢指针
- 思路
- 代码
- 复杂度
- 方法二:哈希表
- 思路
- 代码
- 复杂度
牛客热题:判断链表是否有环
题目链接
判断链表中是否有环_牛客题霸_牛客网 (nowcoder.com)
方法一:快慢指针
思路
- 设两个指针一个快指针,一个慢指针。
- 当快指针和慢指针相遇的时候(也就是说快指针从后面又重新超越了慢指针),那么我们则认为链表内部是有环的
代码
bool hasCycle(ListNode *head)
{
ListNode* l = head;
ListNode* r = head;
while(r && r->next)
{
l = l->next;
r = r->next->next;
if(l == r) return true;
}
return false;
}
复杂度
时间复杂度:O(N),其中N为链表的长度,原因是当第一次相遇的时候慢指针的移动距离不会超过链表的长度
空间复杂度:O(1),只建立了两个指针。
方法二:哈希表
思路
- 将我们遍历过的节点的指针插入到哈希表
代码
bool hasCycle(ListNode *head)
{
unordered_set<ListNode*> hash;
while(head != nullptr)
{
if(hash.count(head)) return true;
else hash.insert(head);
head = head->next;
}
return false;
}
复杂度
时间复杂度:O(N),其中N为链表的长度,遍历最多为链表的长度就可以判定是否有环。
空间复杂度:O(N),最多使用链表长度的空间。