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;
    }
}
相关推荐
AI科技星5 分钟前
《全域数学》第一部 数术本源 第三卷 代数原本第14篇 附录二 猜想证明【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
Wect19 分钟前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·typescript
憨波个27 分钟前
【说话人日志】DOVER-Lap:overlap-aware diarization 输出融合算法
人工智能·深度学习·算法·音频·语音识别
叼烟扛炮34 分钟前
C++第四讲:类和对象(下)
c++·算法·类和对象
Rabitebla35 分钟前
vector 的骨架:三根指针、模板陷阱与迭代器失效的第一现场
开发语言·数据结构·c++·算法
代码不停1 小时前
BFS解决floodfill算法题目练习
算法·宽度优先
上弦月-编程1 小时前
C语言指针从入门到实战
java·jvm·算法
WL_Aurora1 小时前
Python 算法基础篇之树和二叉树
python·算法
txzrxz1 小时前
关于前缀和
算法·动态规划·图论
杨连江1 小时前
载流子矩阵限域束缚实现常温常压超导的理论与结构设计
算法