剑指Offer:环形链表的入口
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer:环形链表的入口相关的知识,希望对你有一定的参考价值。
解题思路
1.使用快慢指针fast和slow来判断链表是否有环,以及快慢指针相遇的点在哪里。
2.找到相遇的点之后,在定义一个新的p节点指向head头节点,然后让p和慢指针slow每次都走一步,直到相遇,就是链表的入口。也就是说从head到入口的距离和从相遇的点到入口的距离是一样的
为什会这样呢?
证明:a=n
1.假设慢指针slow在进入环形圈内第一圈就和快指针fast相遇。
此时fast已经开始第2圈了
2.fast和slow同时出发,所以相遇时两个指针花费的时间一样
3.fast一次走两步,slow一次走一步,所以fast的速度是slow的2倍,即fast的路程是slow的2倍
4.推导:
fast=a+m+n+m
slow=a+m
fast=2*slow
所以:a+m+n+m=2a+2m
化简:a=n.也就是从head到入口的距离与从相遇的点到入口的距离一样
代码
/**
* 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) {
ListNode first=head;
ListNode slow=head;
while(first!=null&&first.next!=null){
first=first.next.next;
slow=slow.next;
if(slow==first){//快慢指针相遇
ListNode p=head;//引入p来卡点慢指针可以停到入口
while(p!=slow){
p=p.next;
slow=slow.next;
}
return p;
}
}
return null;
}
}
以上是关于剑指Offer:环形链表的入口的主要内容,如果未能解决你的问题,请参考以下文章