Leetcode 环形链表2

使用hasHashSet来解决该问题

是的,使用 HashSet 也是一种常见且简单的解决方法。该方法的思路是通过遍历链表并将每个访问过的节点存储在一个 HashSet 中。当遍历到的某个节点已经存在于 HashSet 中时,说明链表存在环,且这个节点就是环的入口节点。

这种方法的优缺点:

  • 优点:

    • 实现简单,逻辑直观。
    • 不需要进行复杂的数学分析。
  • 缺点:

    • 空间复杂度是 O(n),因为需要额外的存储空间来记录已经访问的节点。
    • 时间复杂度依然是 O(n),因为需要遍历链表中的所有节点。

代码逻辑:

  1. 遍历链表 :我们使用 current 指针从链表头开始遍历每一个节点。
  2. 判断环的入口 :在遍历的过程中,检查当前节点是否已经存在于 HashSet 中。如果存在,说明该节点就是链表环的入口节点。
  3. 无环处理 :如果遍历链表直到 current 为空(即 null),说明链表无环,返回 null。

复杂度分析:

  • 时间复杂度:O(n),因为我们需要遍历链表中的所有节点一次。
  • 空间复杂度 :O(n),由于我们使用了一个 HashSet 来存储链表中所有已访问的节点。

对比 Floyd 龟兔赛跑算法:

  • Floyd 龟兔赛跑算法 的空间复杂度为 O(1),时间复杂度为 O(n),因此它在空间复杂度上比使用 HashSet 的方法更优。
  • 使用 HashSet 的方法由于需要额外的存储空间,空间复杂度为 O(n),但它的实现更加直观,不需要快慢指针和数学推导。

总的来说,使用 HashSet 是一种简单易懂的方法,可以解决这个问题,但在空间效率上不如 Floyd 算法。

java 复制代码
public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null) {
            return null;
        }
        HashSet<ListNode> visited = new HashSet<>();

        ListNode currentNode = head;
        while(currentNode != null) {
            if(visited.contains(currentNode)) {
                return currentNode;
            }
            visited.add(currentNode);
            currentNode = currentNode.next;
        }
        return null;
    }
}
相关推荐
Dovis(誓平步青云)几秒前
总用电下降了,为什么家庭能源看板仍然提示异常
java·开发语言·数据库·人工智能·算法·电脑·能源
开开心心就好4 分钟前
A3的PDF怎么切成A4?拖一下分割线就行
服务器·开发语言·python·算法·pdf·ocr·tornado
闻缺陷则喜何志丹29 分钟前
详细设计说明书的内容要求
算法·测试·存储
和裕35 分钟前
定制纸箱刀卡、平卡、隔档分别是什么?结构与适用场景区别全解析
大数据·运维·网络·人工智能·算法
Tisfy1 小时前
LeetCode 3723.数位平方和的最大值:构造
数学·算法·leetcode·字符串·题解
hetao17338371 小时前
联盟场-提高组-R4 & ZYZSC-S-Round 7
c++·算法
碧海银沙音频科技研究院1 小时前
基于炬芯ATS3089X音箱的音乐播放歌词显示功能实现
人工智能·驱动开发·嵌入式硬件·算法
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言数组 —— 知识点详解(8)
c语言·学习·算法
hetao17338371 小时前
联盟场-提高组-R2 & ZYZSC-S-Round 5
c++·算法
其实防守也摸鱼2 小时前
Codex 下载与本地部署实战指南
linux·服务器·前端·数据库·算法·ai