NC3:链表中环的入口节点

链表中环的入口节点

http://www.nowcoder.com/questionTerminal/6e630519bf86480296d0f1c868d425ad

  1. 第一步,找环中相汇点。分别用p1,p2指向链表头部,
  2. p1每次走一步,p2每次走二步,直到p1==p2找到在环中的相汇点。
    图片说明
  • 那么我们可以知道fast指针走过a+b+c+b
  • slow指针走过a+b
  • 那么2*(a+b) = a+b+c+b
  • 所以a = c
  • 那么此时让slow回到起点,fast依然停在z,两个同时开始走,一次走一步
  • 那么它们最终会相遇在y点,正是环的起始点
    /**
    * 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) {
           if(head==null || head.next==null){
               return null;
           }
           ListNode fast=head;
           ListNode slow=head;
           while(fast!=null && fast.next!=null){
               fast=fast.next.next;
               slow=slow.next;
               if(slow==fast){//利用快慢指针找相遇点
                   fast=head;
                   while(fast!=slow){
                       slow=slow.next;//设置以相同速度的新指针从起始位置出发
                       fast=fast.next;
                   }
                   return slow;
               }
           }
           return null;
       }
    }
名企高频面试算法题解 文章被收录于专栏

牛客题霸 - 程序员面试高频题 - 题解

全部评论
万一不止一圈,才相遇了呢
3 回复 分享
发布于 2021-01-29 22:04
秒啊,秒啊
点赞 回复 分享
发布于 2021-04-29 18:21
怎么证明一定是走了一圈就相遇
点赞 回复 分享
发布于 2021-03-06 23:51
为什么 快指针 走a+b+c+b呢?
点赞 回复 分享
发布于 2021-01-29 22:03

相关推荐

10-10 01:10
已编辑
深圳大学 测试开发
面了100年面试不知...:六月到九月,四个项目一个实习,是魔丸吗
投了多少份简历才上岸
点赞 评论 收藏
分享
迷茫的大四🐶:💐孝子启动失败,改为启动咏鹅
点赞 评论 收藏
分享
评论
25
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务