LeetCode题解:Java中判断单向链表有环、如果有环,求环的长度和入环节点

本文介绍了三种Java方法判断单向链表是否存在环,包括传统遍历、使用HashSet和双指针法,以及如何在有环情况下计算环的长度和找到入环节点。详细解析了每个方法的时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

有一个单向链表,链表当中有可能出现“环”。
力扣题:141 .Linked List Cycle 环形链表

判断出这个链表是否有环?

方法一:

传统的方法:

  1. 遍历单链表的每一个节点,每遍历一个新的节点,就从头检查新节点之前的所有节点,用新节点和此节点之前所有节点依次作比较。
  2. 如果发现新节点之前的所有节点当中存在相同节点ID,则说明该节点被遍历过两次,链表有环;
  3. 如果之前的所有节点当中不存在相同的节点,就继续遍历下一个新节点,继续重复刚才的操作。
  • 时间复杂度:O(n²) 空间复杂度:O(1)

方法二:

  1. 首先创建一个以节点ID为键的HashSet集合,用来存储曾经遍历过的节点。
  2. 从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就用新节点和HashSet集合当中存储的节点作比较
  3. 如果发现HashSet当中存在相同节点ID,则说明链表有环
  4. 如果HashSet当中不存在相同的节点ID,就把这个新节点ID存入HashSet
  5. 之后进入下一节点,继续重复刚才的操作。
  • 时间复杂度:O(n) 空间复杂度:O(n)
public class Solution {
   
    public ListNode detectCycle(ListNode head) {
   
        HashSet<ListNode> hashSet = new HashSet<>();
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        ListNode cur = dummyHead;
        while(null != cur.next){
   
            if(hashSet.contains(cur.next)){
   
                return cur.next;
            }
            cur = cur.next;
            hashSet.add(cur);
        }
        return null;
    }
}

方法三:

  1. 首先创建两个指针1和2(在java里就是两个对象引用),同时指向这个链表的头节点。
  2. 然后开始一个大循环,在循环体中,让指针1每次向下移动一个节点,让指针2每次向下移动两个节点,然后比较两个指针指向的节点是否相同。
  3. 如果相同,则判断出链表有环,如果不同,则继续下一次循环。
  • 时间复杂度:O(n) 空间复杂度:O(1)
public class Solution {
   
    public ListNode detectCycle
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值