今天做 LeetCode 第 141. 环形链表 题目,难度为 Easy。
一. 题目要求
给定一个链表,判断该链表是是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
- 示例1
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
- 示例 2
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
- 示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
二. 解题思路 & 代码
一道非常经典的 快慢指针 的题目,解题思路也很固定,采用快慢指针遍历链表即可:
- 如果一个链表有环,那么快指针与慢指针一定会相遇
- 如果没有环,则快指针最终会变为 null
具体实现代码如下:
- Java 实现
public class Solution {
public boolean hasCycle(ListNode head) {
if (Objects.isNull(head) || Objects.isNull(head.next)) {
return false;
}
ListNode fast = head.next;
while (fast != null && fast.next != null) {
head = head.next;
fast = fast.next.next;
if (head == fast) {
return true;
}
}
return false;
}
}
- Go 实现
*/
func hasCycle(head *ListNode) bool {
if head == nil {
return false
}
fast := head
slow := head
for ; fast != nil && fast.Next != nil; {
slow = slow.Next
fast = fast.Next.Next
if fast == slow {
return true
}
}
return false
}
- Python 实现
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if not head:
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
三. 解题后记
作为 Easy 级别的题目,只要知道了快慢指针的解法,题目做起来是很快的,分分钟搞定。