标签:amp 判断链表是否有环 ext linked img val 就是 null 速度
解题思路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;
}
}
标签:amp 判断链表是否有环 ext linked img val 就是 null 速度
原文地址:https://blog.51cto.com/14234228/2501023