zoukankan      html  css  js  c++  java
  • 找出链表环的入口

    问题:

      给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

    分析:快慢指针+公式推导

      参考:https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4?f=discussion(来源:牛客网)

    code:

      

    public class ListNode {
            int val;
            ListNode next = null;
    
            ListNode(int val) {
                this.val = val;
            }
        }
        public ListNode EntryNodeOfLoop2(ListNode pHead){
            //参考的别人的代码:快慢指针+公式推导
            /*
            推导结果:如果存在循环
            (1)第一次出发:快指针(一次走两步),慢指针一次一步,最终一定会在环的某点相遇
            (2)第二次出发:两个指针分别从头结点和相遇节点出发,最后一定会在环入口节点相遇
             */
            if(pHead==null){
                return null;
           }else{
                ListNode low= pHead;
                ListNode fast = pHead;
               while(fast!=null &&fast.next!=null){
                    fast = fast.next.next;
                    low = low.next;
                    if(fast==low) break;
               }
               //没找到环
               if(fast==null || fast.next==null) return null;
    
               //找到环,根据结论2寻找环入口
               fast=pHead;
               while(fast!=low){
                   fast = fast.next;
                   low = low.next;
               }
               return fast;
           }
        }

    大佬的代码:

      public class ListNode {
            int val;
            ListNode next = null;
    
            ListNode(int val) {
                this.val = val;
            }
        }
    public ListNode EntryNodeOfLoop(ListNode pHead)
        {
                ListNode fast=pHead;
                ListNode low=pHead;
                while(fast!=null&&fast.next!=null){
                    fast=fast.next.next;
                    low=low.next;
                    if(fast==low)
                        break;
                }
                if(fast==null||fast.next==null)
                    return null;
                low=pHead;
                while(fast!=low){
                    fast=fast.next;
                low=low.next;
            }
            return low;
        }
  • 相关阅读:
    POJ:3126-Prime Path
    Linux用户操作及权限
    Web前段开发人员须知的常见浏览器兼容性问题及解决技巧
    windows激活
    未来十年最具有潜力的行业
    WebStorm激活码存储
    5种关系型数据库
    linux常用命令总结
    进程、线程、多线程的总结
    C++类库
  • 原文地址:https://www.cnblogs.com/dream-flying/p/12919979.html
Copyright © 2011-2022 走看看