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

题目描述

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

/*
如果链表中环 有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。
当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。
所以首先要得到环中结点的数目。
*/
/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
	//如果环存在,则一个每次走2步,一个每此走一步,最终相遇的地方一定在环内。
    public ListNode MeetNode(ListNode node){
        if(node==null){
            return null;
        }
        ListNode one = node.next;
        if(one == null) {
            return null;
        }
        ListNode two = one.next;
        if(two==null){
            return null;
        }
        while(one!=null && two!=null){
            if(one==two){
                return two;
            }
            one = one.next;
            two = two.next;
            if(two.next==null){
                return null;
            }else{
                two = two.next;
            }
        }
        return null;
    }
    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        //需要找到环的节点个数
        ListNode p1 = MeetNode(pHead);
        if(p1==null){
            return null;
        }
        //找一个节点一直跑,知道重复到这个节点,那么环的个数就知道了
        ListNode p2 = p1;
        int count =1;
        while(p2.next!=p1){
            p2=p2.next;
            count++;
        }
        //找到环的个数后,一个节点先走count,一个后走count,相遇的位置即是环口
        ListNode first = pHead;
        for(int i=0;i<count;i++){
            first = first.next;
        }
        ListNode second = pHead;
        while(first !=second){
            first = first.next;
            second = second.next;
        }
        return first;
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值