LeetCode:142环形链表Ⅱ

java 复制代码
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
    
        while(fast != null && fast.next != null){
            //快指针走两步慢指针一步
            slow = slow.next;
            fast = fast.next.next;
            //快慢指针相遇
            if(slow == fast){
                ListNode index1 = slow;
                ListNode index2 = head;
                //两指针一步一步走
                while(index1 != index2){
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;
    }
}

假设a表示从起点到环入口的距离;b表示从环入口到相遇点的距离;c表示从相遇点继续往前走到环入口的距离。

慢节点走过的距离:a+b

快节点走过的距离:a+b+n(b+c),表示快节点在圈中多转了n圈

快节点是慢节点的两倍,所以2(a+b)=a+b+n(b+c)

a+b=n(b+c)

a=n(b+c)-b

a=(n-1)(b+c)+c

a的长度等于快节点在环里面转(n-1)圈后再走c的长度

所以将慢节点放到head,快节点放到相遇位置,然后以相同速度前移,最终会得到相遇的位置

相关推荐
KJ_BioMed1 小时前
从PDB到高亲和力分子:De novo生成式计算化学Pipeline剖析
算法·生物医药·生物科研·科研干货·化合物设计
一个王同学2 小时前
从零到一 | CV转多模态大模型 | week17 | LLM 推理优化 & vLLM 详解
人工智能·深度学习·算法·机器学习·计算机视觉·vllm
旖-旎3 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
变量未定义~3 小时前
单调栈+倍增思想 皇家守卫【算法赛】、单调队列 附近最小
算法
QN1幻化引擎3 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
拂拉氏3 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树
可靠的仙人掌4 小时前
SAC(Soft Actor-Critic)算法底座
开发语言·算法·php
c238564 小时前
《动态规划:从“傻傻穷举”到“过目不忘”的修仙之路》
c++·算法·动态规划
海石5 小时前
单调栈复健,顺便,牺牲一下吧,空间复杂度!一切献给AC
算法·leetcode
海石5 小时前
JS击败94%,Hard题想不到动态规划,那就用数组和栈试试
算法·leetcode