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,快节点放到相遇位置,然后以相同速度前移,最终会得到相遇的位置

相关推荐
空堂与归1 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing1 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习2 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨2 小时前
基础数论总结
笔记·学习·算法
夜不会漫长4 小时前
C++入门(1)
开发语言·c++·算法
wen_zhufeng4 小时前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
大熊背5 小时前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline
一米阳光86615 小时前
软考(中级)软件设计师核心笔记(9)算法——背包问题
笔记·算法·职场发展·软考·软件设计师·中级职称
晚风醉蝶5 小时前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
旖旎夜光5 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找