0
点赞
收藏
分享

微信扫一扫

LeetCode 数据结构与算法之环形链表


题目

141. 环形链表

给你一个链表的头节点 ​​head​​ ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 ​​next​​​ 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 ​​pos​​​ 来表示链表尾连接到链表中的位置(索引从 ​​0​​ 开始)。

注意:​​pos​​ 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 ​​true​​​ 。 否则,返回 ​​false​​ 。

示例 1:LeetCode 数据结构与算法之环形链表_时间复杂度

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

LeetCode 数据结构与算法之环形链表_复杂度_02

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

LeetCode 数据结构与算法之环形链表_复杂度_03

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

  • 链表中节点的数目范围是​​[0, 104]​
  • ​-105 <= Node.val <= 105​
  • ​pos​​​ 为​​-1​​ 或者链表中的一个 有效索引 。

  进阶:你能用 ​​O(1)​​(即,常量)内存解决此问题吗?

题解

解题分析

解题思路

最容易想到的方法是遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过。

具体地,我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表即可。

复杂度

时间复杂度 O(N)

空间复杂度 O(N)

解题代码

题解代码如下(代码中有详细的注释说明):

/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
Set<ListNode> seen = new HashSet<>();
while(head != null) {
if (!seen.add(head)) {
return true;
}
head = head.next;
}
return false;
}
}

提交后反馈结果(由于该题目没有进行优化,性能一般):

LeetCode 数据结构与算法之环形链表_时间复杂度_04

参考信息

  • ​​力扣 141. 环形链表​​
举报

相关推荐

0 条评论