链表中环的入口

标签: a
8人阅读 评论(1) 收藏 举报
分类:

题目表述

一个链表中包含环,请找出该链表的环的入口结点。

思路

这里写图片描述

假设x为环前面的路程(黑色路程),a为环入口到相遇点的路程(蓝色路程,假设顺时针走), c为环的长度(蓝色+橙色路程),当快慢指针相遇的时候:
此时慢指针走的路程为Sslow=x+mc+a
快指针走的路程为Sfast=x+nc+a
气质快指针比慢指针多走了nm
可得:

2Sslow=Sfast

2(x+mc+a)=(x+nc+a)

从而可以推导出:
x=(n2m)ca=(n2m1)c+ca

即环前面的路程 = 数个环的长度(为可能为0) + ca
什么是ca?这是相遇点后,环后面部分的路程。(橙色路程)
所以,我们可以让一个指针从起点A开始走,让一个指针从相遇点B开始继续往后走,
2个指针速度一样,那么,当从原点的指针走到环入口点的时候(此时刚好走了x
从相遇点开始走的那个指针也一定刚好到达环入口点。
所以2者会相遇,且恰好相遇在环的入口点。
最后,判断是否有环,且找环的算法复杂度为:
时间复杂度:O(n)
空间复杂度:O(1)

代码

public class Solution {
 
    ListNode EntryNodeOfLoop(ListNode pHead){
        if(pHead == null || pHead.next == null)
            return null;
        ListNode p1 = pHead;
        ListNode p2 = pHead;
        while(p2 != null && p2.next != null ){
            p1 = p1.next;
            p2 = p2.next.next;
            if(p1 == p2){
                p2 = pHead;
                while(p1 != p2){
                    p1 = p1.next;
                    p2 = p2.next;
                }
                if(p1 == p2)
                    return p1;
            }
        }
        return null;
    }
}

参考

链接:https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4
来源:牛客网

查看评论

剑指Offer--056-链表中环的入口结点

链接 牛客OJ:链表中环的入口结点 九度OJ:未收录 GitHub代码: 056-链表中环的入口结点 CSDN题解:剑指Offer–056-链表中环的入口结点 牛客...
  • gatieme
  • gatieme
  • 2016-06-07 13:25:50
  • 1889

剑指offer-----链表中环的入口节点(java版)

一 题目 一个链表中包含环,请找出该链表的环的入口结点。 二 思路 我们假设链表的头结点离环的入口节点为k,定义p1和p2指向链表的头结点,p2走的步长为2,p1的步长为1,当p1走了k步后...
  • sniperken
  • sniperken
  • 2016-12-25 16:22:37
  • 460

剑指offer--链表中环的入口结点

题目描述 一个链表中包含环,请找出该链表的环的入口结点。 分析: 如果存在环,找到环的起始结点 当fast指针等于slow指针时,slow指针肯定还没有遍历完整个链表,而此时fast指针已...
  • kangaroo835127729
  • kangaroo835127729
  • 2015-04-17 17:48:11
  • 1893

《剑指offer》——链表中环的入口结点

T: 题目描述 一个链表中包含环,请找出该链表的环的入口结点。 基本做法不考虑其中潜在的规律,就按照一般的方法,创建一个list,把扫描过的节点都存储在list中,知道下一个节点在lis...
  • shansusu
  • shansusu
  • 2015-12-13 20:02:01
  • 1221

链表中环的入口节点(Java实现)

本题为剑指offer面试题56 牛客网测试地址:https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4 ...
  • zjkC050818
  • zjkC050818
  • 2017-06-06 15:58:41
  • 399

剑指offer(58):链表中环的入口节点

题目描述一个链表中包含环,请找出该链表的环的入口结点。
  • u011080472
  • u011080472
  • 2016-04-30 15:23:02
  • 400

《剑指offer》链表中环的入口结点

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】 题目链接:http://www.nowcoder.com/p...
  • libin1105
  • libin1105
  • 2015-09-13 17:54:02
  • 951

剑指Offer面试题56:链表中环的入口节点 Java实现

题目:链表中环的入口节点         一个链表中包含环,如何找出环的入口节点?例如,下图中的入口节点是3.              1->2->3->4->5->6    ...
  • gg543012991
  • gg543012991
  • 2016-10-13 23:33:11
  • 361

剑指offer----链表中环的入口节点----java实现

一个链表中包含环,请找出该链表的环的入口结点。 此问题包含两个步骤: (1)判断链表中是否有环 (2)找出环 一、 1)选择快慢指针,让快指针每次走两步,慢指针每次走一步,若是单链表中有环的话,那么两...
  • snow_7
  • snow_7
  • 2016-08-11 11:54:01
  • 1283
    个人资料
    持之以恒
    等级:
    访问量: 303
    积分: 137
    排名: 116万+
    文章存档
    最新评论