LeetCode 热题100 | 141. 环形链表
大家好,今天我们来解决一道经典的算法题——环形链表。这道题在 LeetCode 上被标记为简单难度,要求我们判断一个链表中是否存在环。下面我将详细讲解解题思路,并附上 Python 代码实现。
题目描述
给定一个链表的头节点 head
,判断链表中是否有环。如果链表中有某个节点可以通过连续跟踪 next
指针再次到达,则链表中存在环。返回 true
表示链表中有环,否则返回 false
。
示例:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
解题思路
判断链表是否有环,常用的方法是 快慢指针法(Floyd 判圈算法)。快慢指针法的核心思想是使用两个指针,一个快指针和一个慢指针,快指针每次走两步,慢指针每次走一步。如果链表中有环,快指针最终会追上慢指针;如果没有环,快指针会到达链表末尾。
核心思想
- 快慢指针:
代码实现
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def hasCycle(head):
"""
:type head: ListNode
:rtype: bool
"""
if not head or not head.next:
return False
slow = head # 慢指针
fast = head # 快指针
while fast and fast.next:
slow = slow.next # 慢指针走一步
fast = fast.next.next # 快指针走两步
if slow == fast: # 如果相遇,说明有环
return True
return False # 如果没有相遇,说明无环
代码解析
复杂度分析
示例运行
示例 1
# 创建链表 [3,2,0,-4],并形成环
head = ListNode(3)
head.next = ListNode(2)
head.next.next = ListNode(0)
head.next.next.next = ListNode(-4)
head.next.next.next.next = head.next # 形成环
# 判断链表是否有环
print(hasCycle(head)) # 输出: True
示例 2
# 创建链表 [1,2],并形成环
head = ListNode(1)
head.next = ListNode(2)
head.next.next = head # 形成环
# 判断链表是否有环
print(hasCycle(head)) # 输出: True
示例 3
# 创建链表 [1],无环
head = ListNode(1)
# 判断链表是否有环
print(hasCycle(head)) # 输出: False
总结
通过快慢指针法,我们可以高效地判断链表是否有环。这种方法的时间复杂度为 O(n),空间复杂度为 O(1),能够处理较大的输入规模。希望这篇题解对你有帮助!如果还有其他问题,欢迎继续提问!
关注我,获取更多算法题解和编程技巧!