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-09 17:17
已编辑
门头沟学院 Java
活泼的代码渣渣在泡池...:同学你好,我也是学院本,后天要面这个亚信科技,是实习,请问问题都啥样呀,我项目就做了网上的,这是第一次面试
投递多益网络等公司10个岗位
点赞 评论 收藏
分享
09-16 17:32
门头沟学院 Java
顺顺超爱学:1.熟悉Java编程语言,熟悉集合,多线程,IO,反射等核心知识,了解线程池,ThreadLocal等进阶知识; 2.熟悉Mysql数据库,熟练使用sql,熟悉索引,存储引擎,事务原理,MVCC,锁机制,了解sql优化; 3.熟悉Redis缓存,了解常见的数据类型,了解缓存常见问题及其解决方案,了解使用Redis实现的分布式锁方案; 4.熟悉Javaweb开发框架,熟悉spring,springmvc,mybatis等,了解IOC,AOP等; 5.熟悉微服务开发框架,熟悉SpringBoot,SpringCloud,包括Nacos,OpenFeign,Gateway等核心组件; 6.熟悉Rabbitmq消息队列,熟练使用消息模型,了解架构,消息可靠性,死信队列,延迟消息等;
点赞 评论 收藏
分享
评论
25
3
分享

创作者周榜

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