LeetCode---142. Linked List Cycle II

##LeetCode—142. Linked List Cycle II
####题目
https://leetcode.com/problems/linked-list-cycle-ii/description/
这道是141的follow up,不止是判断是不是有环链表了。还要判断环的入口在哪里。诶??怎么写到题目里了,应该写到分析里的,,无所谓了。题目就是判断链表是不是带环,如果带,返回入口节点。

####思路及解法
剑指offer原题。直接上方法:
1.判断是不是带环,不是返回null(方法就是快慢指针);否则进入下一步
2.带环的情况下,移动fast和slow重合,然后fast每次移动一部,slow不动,直到次相遇。目的是得到环的长度len
3.slow移回head,fast移到距离slow长度len的位置,然后同时移动fast和slow,当slow和fast相遇时,就是入口。
这里写图片描述
我们可以这么去理解最后一部的原理,两个人同样速度跑步,起点在赛道之外,A首先出发先走环形赛道长度len,然后两者相同速度前进,这时,A距离赛道上起点的位置的距离恰好是,赛道外起始位置到赛道上起点位置的距离。
假设赛道外起点到最终两者相遇路程S,赛道外起点到赛道上起点距离x,环形赛道长度len, S=x+len。一开始A先走了len,然后两人同时走x,此时A走了x+len,B走了x,而环形的长度恰好是len,也就是相当于A走了x+0.所以两者相遇。

####代码

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null || head.next == null) return null;
        ListNode fast = head.next;
        ListNode slow = head;
        
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){
                int len = 1;
                fast = fast.next;
                while(fast != slow){
                    len ++;
                    fast = fast.next;
                }
                slow = head;
                fast = head;
                for(int i=0; i<len; i++){
                    fast = fast.next;
                }
                while(fast != slow){
                    fast = fast.next;
                    slow = slow.next;
                }
                return fast;
            }
        }
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值