【LeetCode面试150】——141环形列表
博客昵称:沈小农学编程
作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟!
PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
题目难度:简单
默认优化目标:最小化时间复杂度。
Python默认为Python3。
目录
1 题目描述
2 题目分析
3 算法框架及代码实现
3.1 哈希表
3.2 快慢指针
参考文献
1 题目描述
给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true
。 否则,返回 false
。
示例 1:
输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。示例 2:
输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。示例 3:
输入:head = [1], pos = -1 输出:false 解释:链表中没有环。提示:
链表中节点的数目范围是
[0, 104]
-105 <= Node.val <= 105
pos
为-1
或者链表中的一个 有效索引 。
2 题目分析
输入是一个链表head,输出是布尔值。如果存在环,返回true;否则,返回false。表示循环点的位置整数pos只是在图中演示方便理解,不作为实际形参传递。
我们自然而然会想到链表,然后循环的本质是循环链表上的元素都能依次重复的访问到。用哈希表最合适。
3 算法框架及代码实现
3.1 哈希表
我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果哈希表中存在该节点,说明链表是环形的,否则将该节点加入到哈希表中。重复,直到全部遍历。
算法流程图如下:
时间复杂度O(n),空间复杂度O(n)。
C++代码实现
class Solution {
public:
bool hasCycle(ListNode *head) {
unordered_set<ListNode*> seen;
while (head != nullptr) {
if (seen.count(head)) {
return true;
}
seen.insert(head);
head = head->next;
}
return false;
}
};
Python代码实现
class Solution:
def hasCycle(self, head: ListNode) -> bool:
seen = set()
while head is not None:
if head in seen:
return True
seen.add(head)
head = head.next
return False
3.2 快慢指针
202快乐数中也用到了快慢指针法。简单来说,设置一个快指针兔子,慢指针乌龟。兔子一次跑两个,乌龟一个。如果兔子能和乌龟相遇,则环形,返回true;反之返回false。
算法流程图如下:
时间复杂度O(n),空间复杂度O(1)。
C++代码实现
class Solution {
public:
bool hasCycle(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return false;
}
ListNode* slow = head;
ListNode* fast = head->next;
while (slow != fast) {
if (fast == nullptr || fast->next == nullptr) {
return false;
}
slow = slow->next;
fast = fast->next->next;
}
return true;
}
};
Python代码实现
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if head is None or head.next is None:
return False
slow = head
fast = head.next
while slow != fast:
if fast is None or fast.next is None:
return False
slow = slow.next
fast = fast.next.next
return True
参考文献
力扣面试经典150题
力扣官方题解