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;
    }
}
相关推荐
阿巴~阿巴~几秒前
蓝桥杯 C/C++ 组历届真题合集速刷(一)
c语言·c++·算法·蓝桥杯
_x_w7 分钟前
【12】数据结构之基于线性表的排序算法
开发语言·数据结构·笔记·python·算法·链表·排序算法
瀚海澜生22 分钟前
链表系列入门指南(二):吃透这几题,链表解题不再难
后端·算法
爱编码的傅同学27 分钟前
数据结构(五)——AVL树(平衡二叉搜索树)
数据结构·算法
Bonnie_121528 分钟前
02-redis-数据结构实现原理
数据结构·redis·算法
Wood_Like1 小时前
从递归入手一维动态规划
算法·动态规划
折枝寄北1 小时前
数据结构 | 证明链表环结构是否存在
数据结构·链表
爱奥尼欧2 小时前
算法竞赛中常用的数据处理库函数
算法
袖清暮雨2 小时前
【专题】贪心算法
算法·贪心算法
_Vinyoo2 小时前
算法——分治
数据结构·算法