zoukankan      html  css  js  c++  java
  • 剑指Offer:链表中环的入口节点【23】

    剑指Offer:链表中环的入口节点【23】

    题目描述

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

    题目分析

      第一步确定链表中是否包含环,怎么确定呢?我们定义两个指针橙和蓝,橙每次走一步,蓝每次走两步,如果他俩重合了,这就说明链表中存在环

      

      第二步求环的长度,两者碰头后,让其中一个继续走,每走一步步数加一,然后求得环的长度。

      第三步求环的初始节点,仍然是两个指针,其中一个事先走环长个节点,然后两者同时移动,直到两者碰头,然后那个节点就是环的初始节点。

      

    Java题解

    public static ListNode EntryNodeOfLoop(ListNode pHead)
        {
            //确定是否有环
            if(isCircle(pHead))
            {
                //求环的长度
                int len =getLenOfCircle(pHead);
                ListNode pA = pHead;
                ListNode pB = pHead;
                for(int i=0;i<len;i++)
                {
                    pB=pB.next;
                }
                while (pA.val!=pB.val)
                {
                    pA=pA.next;
                    pB=pB.next;
                }
                return pA;
            }
            return null;
        }
        //确定是否有环
        public static boolean isCircle(ListNode pHead)
        {
            try {
                ListNode pA = pHead.next;
                ListNode pB = pHead.next.next;
                while (pA != null && pB != null && pA.val != pB.val) {
                    pA = pA.next;
                    pB = pB.next.next;
                }
                return true;
            }catch (Exception e)
            {
                return false;
            }
        }
        //求环的长度
        public static int getLenOfCircle(ListNode pHead)
        {
            ListNode pA = pHead.next;
            ListNode pB = pHead.next.next;
            while (pA != null && pB != null && pA.val != pB.val) {
                pA = pA.next;
                pB = pB.next.next;
            }
            int length = 1;
            while (pB.next.val!=pA.val)
            {
                pB=pB.next;
                length++;
            }
            return length;
        }

    巧妙的方法

    import java.util.*;
    public class Solution {
     
        public ListNode EntryNodeOfLoop(ListNode pHead)
        {
            if(pHead==null)
                return null;
            ListNode pNode=pHead;
            HashSet<ListNode> pSet = new HashSet<ListNode>();
            while(pNode!=null){
                if(!pSet.add(pNode))
                    return pNode;
                pNode=pNode.next;
            }
            return null;
        }
    }
  • 相关阅读:
    POI_Excel表格数据导入导出实例--支持xls/xlsx格式
    js图片压缩工具---base64码上传插件,兼容h5和微信端(lrz.mobile.min.js)
    同一个页面,加载不同版本jQuery
    This method isn't transactional
    jquery.cookie的使用,记住用户名
    正则表达式 2017/6/12
    kSet 2017/6/6
    差分与二维差分
    求组合数
    高精度
  • 原文地址:https://www.cnblogs.com/MrSaver/p/9280473.html
Copyright © 2011-2022 走看看