关闭

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

标签: 链表java
414人阅读 评论(0) 收藏 举报
分类:

题目描述

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

分析

1,找一个环中的节点
2,通过环中的节点,通过遍历计算环中的节点个数
3,如果链表中环 有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点,此时两个节点恰好在入口处相遇,即入口节点。

class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead) {
        // 防止后续判断节点空指针,提前否定空或只有一个的节点
        if(pHead==null||pHead.next==null){
            return null;
        }
        int loopSum = sumLoopNode(pHead);
        ListNode p1=pHead;
        ListNode p2=pHead;
        for (int i = 0; i < loopSum; i++) {
            p1=p1.next;
        }

        // 通过分析,当两个节点恰好相遇时,此时就是入口节点
        while(p1!=p2){
            p1=p1.next;
            p2=p2.next;
        }
        return p1;
    }

    // 计算环中的节点数目
    private int sumLoopNode(ListNode pHead) {
        // TODO Auto-generated method stub
        ListNode meetNode = getMeetNode(pHead);
        ListNode tempNode = meetNode.next;
        int sum = 1;
        while (meetNode != tempNode) {
            tempNode = tempNode.next;
            sum++;
        }
        return sum;
    }

    // 找到在环中的相遇节点,便于计算环中的节点数目
    private ListNode getMeetNode(ListNode pHead) {
        // TODO Auto-generated method stub
        if (pHead == null) {
            return null;
        }
        ListNode slow = pHead;
        ListNode fast = pHead.next;
        while (slow != fast) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}
0
0
查看评论

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

题目描述 一个链表中包含环,请找出该链表的环的入口结点。 分析: 如果存在环,找到环的起始结点 当fast指针等于slow指针时,slow指针肯定还没有遍历完整个链表,而此时fast指针已经在环内循环了n圈(n>=1),假定从链表头指针开始slow走了s步,则fast走了2s步,f...
  • kangaroo835127729
  • kangaroo835127729
  • 2015-04-17 17:48
  • 1762

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

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

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

一个链表中包含环,请找出该链表的环的入口结点。 此问题包含两个步骤: (1)判断链表中是否有环 (2)找出环 一、 1)选择快慢指针,让快指针每次走两步,慢指针每次走一步,若是单链表中有环的话,那么两个指针会相遇,即指向的相同的节点的值相等来判断。 2)当相遇的时候,慢指针在环中走了k步,设环之外的...
  • snow_7
  • snow_7
  • 2016-08-11 11:54
  • 964

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

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

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

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

剑指offer-面试题56-链表中环的入口结点

链表节点结构定义: package case56_EntryNodeOfLoop; /** * 单链表的节点结构定义 * * @author WangSai * */ public class ListNode { int data; ListNode next; pu...
  • VIP_WangSai
  • VIP_WangSai
  • 2017-05-03 23:59
  • 207

剑指offer-面试题56:链表中环的入口结点

题目:一个链表中包含环,如何找出环的入口结点?例如下图的链表中,环的入口结点是结点3。
  • moses1213
  • moses1213
  • 2016-04-27 20:45
  • 264

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

题目描述一个链表中包含环,请找出该链表的环的入口结点。解题思路1,使用快慢指针找到碰撞点 2,两个同速指针分别从头节点和碰撞点出发,相遇的地方就是入口节点代码实现/** * */ package 链表;/** * <p> * Title:EntryNodeOfLoop * ...
  • sinat_33087001
  • sinat_33087001
  • 2017-08-23 10:07
  • 67

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

T: 题目描述 一个链表中包含环,请找出该链表的环的入口结点。 基本做法不考虑其中潜在的规律,就按照一般的方法,创建一个list,把扫描过的节点都存储在list中,知道下一个节点在list中已经存在,那就说明该节点就是入口节点。这种方式下的时间复杂度为O(n2)O(n^2)我的code...
  • shansusu
  • shansusu
  • 2015-12-13 20:02
  • 1096

判断链表是否有环 、 找到环的入口节点

昨天去完笔试的时候遇到以前见过的老题目,记录一下吧...        题目很简单,就是说:给你一个链表,判断是否存在环!同时求出环的入口节点!        我们先看这样一个题目:两个单链表(无环),判断是否有公共节点...
  • shanshanpt
  • shanshanpt
  • 2013-10-20 13:23
  • 5126
    个人资料
    • 访问:95974次
    • 积分:2382
    • 等级:
    • 排名:第18425名
    • 原创:143篇
    • 转载:27篇
    • 译文:0篇
    • 评论:1条
    最新评论