LeedCode142,判断表中是否有环,若有环返回开始进入环的第一个节点[Java]

判断表中是否有环,若有环返回开始进入环的第一个节点

通过跑操场套圈的思想,设置两个指针fast每次走两格,slow每次走一格,
如果fast后来与slow相遇则说明有环,若fast的next是null则说明是无环。
此题只考虑套一圈的情况:
设进入环前走的路程是a,slow进入环后被追上时走的路程是b,环中slow还未走的路程是c(b+c是环的长度)
则fast追上slow时走的路程是:a+(b+c)+b , slow走的路程是:a+b
因为fast的速度是slow的两倍,得出→ 2*(a+b)=a+(b+c)+b 化简得 a = c的结论

根据a = c的结论,当fast和slow相遇后,设置一个指针cur从head出发,slow也继续走,当cur和slow相遇时,此时的结点就是入环的第一节点.

package p3.链式结构;
//判断表中是否有环,若有环返回开始进入环的第一个节点
/*
通过跑操场套圈的思想,设置两个指针fast每次走两格,slow每次走一格,
如果fast后来与slow相遇则说明有环,若fast的next是null则说明是无环。
此题只考虑套一圈的情况:
设进入环前走的路程是a,slow进入环后被追上时走的路程是b,环中slow还未走的路程是c(b+c是环的长度)
则fast追上slow时走的路程是:a+(b+c)+b  slow走的路程是:a+b
因为fast的速度是slow的两倍,得出→ 2*(a+b)=a+(b+c)+b 化简得 a = c的结论

根据a = c的结论,当fast和slow相遇后,设置一个指针cur从head出发,slow也继续走,当cur和slow相遇时,此时的结点就是入环的第一节点
 */
public class Solution142 {
    public ListNode detectCycle(ListNode head) {
        if (head == null || head.next == null){
            return null;
        }
        ListNode solw = head;
        ListNode fast = head;
        while (fast.next != null && fast.next.next != null){
            solw = solw.next;
            fast = fast.next.next;
            if (solw == fast){
                ListNode cur = head;
                while (cur != solw){
                    cur = cur.next;
                    solw = solw.next;
                }
                return cur;
            }
        }
        return null;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值