142. 环形链表 II

题目描述:

在这里插入图片描述
和环形链表相比,就是要返回相遇的那个结点

方法:

利用双指针:

  • 定义快结点和慢结点,快结点一次走两步,慢结点一次一步
    首先判断是否有环,如果无环直接退出

    • 其中,当fast=slow 时,说明有环,这时候要记下他们相遇的那个位置
  • 假如,在环路前面节点数为a,环路里面,节点数为b,那么,

    当快结点和慢结点相遇:

    1. 快结点走了:S1=2*S2
    2. 慢结点走了:S1-S2=n*b
      S2= nb
  • 对于环路入口处,慢结点走到入口处要走,S2=a+nb,而在快结点与慢结点相遇的位置,慢结点已经走了nb,那么,慢结点只要再走a,那时候的位置就是在入口处。

  • 当然,无环的路不能直接确定结点数,所以可以让节点重新从head位置开始走,走到入口位置时,新结点和慢结点刚好相遇,返回此处结点即为环路入口

代码:

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head, slow = head;
        while(true){
            if(fast==null||fast.next==null){ return null; }
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){ break;}
        }
        fast = head;
        while(fast!=slow){
            fast=fast.next;
            slow=slow.next;
        }
        return fast;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值