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

思路:
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;
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

keild

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值