思路

两个指针p,q;p每次走1步,q每次走2步
如果链表有环,p,q必能相遇
因为q快一些,q会先达到链表尾部

代码

public boolean hasCycle(ListNode head) {
ListNode p = head,q = head;
//q快一些,只需要判断q不为空即可
//q要想走2步,也需判断q.next不为空
while(q!=null && q.next!= null){
p = p.next;
q = q.next.next;
if(p == q) return true;
}
return false;
}