力扣142—环形链表Ⅱ(思路+代码)

发布于:2023-01-16 ⋅ 阅读:(474) ⋅ 点赞:(0)

思路:
1.先判断是否为环形链表,否的话 返回null
2.如果是环形链表:
定义两个引用,h1指向头结点,h2指向第一次相遇时的节点位置(第一次相交位置),然后h1,h2同时走,相遇时就是环的入口处

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null || head.next == null){
            return null;
        }
        //先判断是否有环
        ListNode fast = head;
        ListNode slow = head;
        boolean tmp = false;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){
                tmp = true;
                break;
            }
        }
        if(tmp != true){
            return null;
        }
        //创建两个引用 一个从头结点开始 一个从相遇位置开始,每次一起走一步 
        //相等时,就是环的入口点, 不管第一次判断环时是在环头环尾相遇 每次两个引用一次走一步,相遇时都是环入口位置
        //环节点数为奇数时 第一次判断是否有环时,会在环末尾相遇
        //环节点数为偶数时 第一次判断是否有环时,会在环头相遇,
        ListNode h1 = head;
        ListNode h2 = fast;
        //一定会找到入口点
        while(h1 != h2){
            h1 = h1.next;
            h2 = h2.next;
        }
        return h1;
    }
}

运行结果
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到