LeetCode141-环形链表(水题)
因为链表最后一个元素都是null,只有能到达null的,就是无环。
有环链表,只要两个不同的指针,一个走一步,一个走两步,绝对能相遇。
证明一下为什么可以相遇。
假设A的速度是1次一步,B的速度是2步,链表有环,且长度是N。
假设在X步之后相遇了,间隔是D圈
那么就是X/N+DN = 2X/N
可以求得相遇的步数为X=DN*N。
其实给定一个假设更好理解。
如果能求出在某个时刻他们位置一样,那肯定能证明能相遇,用跑操场做类比。
第一次相遇,肯定是他们之间差了一圈。因为刚好一圈的距离才会第一次相遇,好几圈的距离是相遇好几次了。
为了这一圈的距离,可能他们已经跑了很多圈了。但是第一次相遇,距离差肯定是一圈。
假如A的速度是S/s,B是2S/s,跑了T秒,操场长N
ST+N=2ST
可以求得T=N/S,这个N和S都是常量,T肯定是存在的。
所以说,只要存在速度差,肯定会相遇。
接下来就是写代码了
最直接的写法,就是把可能的地方都判断,不然就空指针了
public boolean hasCycle(ListNode head) { if(head==null) return false; //环形跑道,有速度差,肯定会相遇 ListNode p1 = head; ListNode p2 = head; while(true){ //p1走一步 p1=p1.next; //空了肯定不是环 if(p1==null) return false; //next的next相当于走了两步 p2=p2.next; if(p2.next==null) return false; p2=p2.next; if(p2.next==null) return false; //相遇就是环 if(p1==p2) return true; } }