剑指offer-55 链表中环的入口结点 -- Java实现

题目

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
牛客网给定以下链表类。

/*
 public class ListNode {
    int val;
    ListNode next = null;

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

分析

思路一:

在这里插入图片描述
如上图例子,我们要确定链表中环的入口结点,我们应首先确定该链表中是否有环,这一步可以用前面的题用到过的双指针法,即一个快指针一个慢指针,快指针步长为2,慢指针步长为1,都从头遍历,如果没有环的话,两个指针永不会相遇,否则就会相遇,此时判断为有环;其次如果有环的话我们应数出环中的结点个数len;最后如下图,将快指针和慢指针重新归为到pHead,让快指针先走len步,然后再将两个指针一起遍历,相遇的结点便是链表中环的入口结点。
在这里插入图片描述

时间复杂度:o(N)
空间复杂度:o(1)

代码:

public class Solution {
    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        //输入空结点判断
        if(pHead==null) return null;
        
        //1.判断是否有环
        ListNode fast = pHead, slow = pHead;
        boolean flag = false;
        while(fast!=null && fast.next!=null){
            slow = slow.next;
            fast = fast.next.next;
            if(fast==slow){
                flag = true;
                break;
            }
        }
        
        if(!flag){
            return null;
        } else{
            //2.数出环的结点个数
            fast = fast.next;
            int len = 1;
            while(fast!=slow){
                fast = fast.next;
                len++;
            }
            
            //3.找出环的入口结点
            fast = slow = pHead;
            for(int i=0;i<len;i++){
                fast = fast.next;
            }
            while(fast!=slow){
                fast = fast.next;
                slow = slow.next;
            }
            
            return slow;
        }
    }
}
发布了46 篇原创文章 · 获赞 17 · 访问量 1038

猜你喜欢

转载自blog.csdn.net/weixin_42054926/article/details/103178499