当前位置: 首页 > article >正文

LeetCode 142:环形链表入口

题目:
在这里插入图片描述

题解:
在这里插入图片描述
代码示例:

package com.zy.leetcode.LeetCode_142;

/**
 * @Author: zy
 * @Date: 2025-01-03-15:13
 * @Description: 找出链表的环形入口
 */
public class ListNode_142 {

    private int val;

    private ListNode_142 next;
    ;

    public ListNode_142(int x) {
        val = x;
    }

    public ListNode_142(int x, ListNode_142 next) {
        val = x;
        this.next = next;
    }

    //链表打印
    public static void printList(ListNode_142 head) {
        ListNode_142 p = head;
        while (p != null) {
            System.out.print(p.val + " -> ");
            p = p.next;
        }
        System.out.println("null");
    }

    /**
     * 找到链表的环形链表入口节点
     *
     * @param head
     * @return
     */
    public ListNode_142 detectCycle(ListNode_142 head) {
        ListNode_142 slow = head;
        ListNode_142 fast = head;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            /**
             * 相遇之后,快和慢都:步 都为1
             */
            if (slow == fast) {
                // 相遇,有环
                ListNode_142 meetNode = slow;
                ListNode_142 p = head;
                while (p != meetNode) {
                    p = p.next;
                    meetNode = meetNode.next;
                }
                return p;
            }
        }
        return null;

    }

    /**
     * 当环首尾相接,极有可能出问题
     *
     * @param head
     * @return
     */
    public ListNode_142 detectCycle2(ListNode_142 head) {
        ListNode_142 t = head;
        ListNode_142 h = head;

        // 第一阶段
        while (h != null && h.next != null) {
            t = t.next;
            h = h.next.next;
            /**
             * 相遇之后,快和慢都:步 都为1
             */
            if (t == h) {
                // 相遇,有环
                t = head;
                while (true) {
                    t = t.next;
                    h = h.next;
                    if (t == h) {
                        return t;
                    }
                }
            }
        }
        return null;

    }

    public static void main(String[] args) {
        ListNode_142 head = new ListNode_142(1);
        ListNode_142 node2 = new ListNode_142(2);
        ListNode_142 node3 = new ListNode_142(3);
        ListNode_142 node4 = new ListNode_142(4);
        ListNode_142 node5 = new ListNode_142(5);

        head.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node2; // 形成环

        ListNode_142 result = head.detectCycle(head);
        if (result != null) {
            System.out.println("环形入口节点为: " + result.val);
        } else {
            System.out.println("无环");
        }

        ListNode_142 result1 = head.detectCycle2(head);

        if (result1 != null) {
            System.out.println("环形入口节点为: " + result1.val);
        } else {
            System.out.println("无环");
        }

    }

}


http://www.kler.cn/a/466396.html

相关文章:

  • LLM大模型RAG内容安全合规检查
  • Go语言的 的并发编程(Concurrency)核心知识
  • 机器人对物体重定向操作的发展简述
  • Go语言的 的泛型(Generics)基础知识
  • javaEE-文件操作和IO-文件
  • WPS-JS宏快速上手
  • qt的utc时间转本地时间
  • Java基本数据类型与字节数组的相互转换
  • JAVA复习题
  • 使用docker desktop提示 需要更新WSL
  • 深入理解 Android 中的 ApplicationInfo
  • 深入Android架构(从线程到AIDL)_07 线程(Thread) 概念
  • 利用Claude3.5点评学习LightRAG源码
  • css中的渐变
  • 学技术学英文:Tomcat的线程模型调优
  • 基于 GitHub API 的 Issue 和 PR 自动化解决方案
  • ArcGIS API for JavaScript 缓冲区分析、河涌关联分析、集中连片分析
  • 高速网络数据包处理中的内核旁路技术
  • Ae 效果详解:漩涡条纹
  • .NET 8 + Ocelot + Consul 实现代理网关、服务发现
  • 365天深度学习训练营:第N1周:one-hot编码案例
  • 【Unity3D】LOD Group 多细节层次(CrossFade淡出淡入效果)
  • java: JDK isn‘t specified for module ‘product-service‘问题解决
  • 大数据-269 实时数仓 - DIM DW ADS 层处理 Scala实现将数据写出HBase等
  • 阅读线程池源码中遇到的retry:
  • 密码学精简版