判断链表是否有环
运用快慢指针,类似于“龟兔”,假设表中有环,那么速度快的“兔子”则首先进入环,然后在里面绕圈,“乌龟”后入环,它们都在一个环内绕圈,由于速度不等,则一定会相遇。
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) return false;
ListNode slow = head;
ListNode fast = head.next;
while(slow != fast){
if (slow == null || fast == null){
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
为什么初始条件要设置一前一后,则slow指向head,fast指向head.next?
因为终止条件是slow等于fast,所以一开始就得避开二者相等这个情况。
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)