リンクリストにリングがあるかどうかを確認します
「亀とうさぎ」と同様に、速いポインターと遅いポインターを使用して、時計にリングがあり、次に速い「ウサギ」が最初にリングに入り、次に内側を一周し、その後「亀」がリングに入り、それらはすべてリングで一周します、不平等な速度のために、彼らは間違いなく会うでしょう。
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;
}
なぜ初期条件を次々に設定し、次に遅いポイントを頭に、速いポイントを頭に設定する必要があるのですか?
終了条件が遅いと速いので、最初は両者が等しいという状況を避ける必要があります。
複雑さの分析
時間計算量:O(n)
空間計算量:O(1)