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;
    }
}
相关推荐
取名真是34 分钟前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考1 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt3 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
w_zero_one4 小时前
算法--构造
java·数据结构·算法
其实防守也摸鱼5 小时前
信创安全竞赛知识总结与题库
大数据·网络·人工智能·算法·安全·php
小超人诞生日记6 小时前
C++ 智能指针的使用及其原理详解
c++·算法
AiNightVision9 小时前
无人机夜视模块如何选择?——从参数指标到系统集成的完整选型指南
人工智能·算法·计算机视觉·车载系统·无人机·视频·智能硬件
牧羊人.33310 小时前
卷积神经网络之VGG
人工智能·深度学习·神经网络·算法·cnn
小郎君65811 小时前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法