- 서로 다른 속도로 움직이는 두 개의 포인터를 이용해서 O(n) 시간 복잡도, O(1) 공간 복잡도로 Cycle Detection Problem을 해결하는 알고리즘
- 토끼와 거북이는 출발 노드에 같이 선다(head)
- 토끼나 거북이가 종점 노드를 만나지 않으면 다음을 반복한다.
- 토끼는 두 칸을 전진한다.(중간에 종점 노드를 만나면 사이클이 없다고 리턴한다.)
- 거북이는 한 칸을 전진한다.
- 토끼와 거북이가 같은 노드에 위치했으면 사이클이 있다고 Return한다.
- 토끼나 거북이가 종점 노드를 만났으므로 사이클이 없다고 리턴한다.
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init(_ val: Int) {
* self.val = val
* self.next = nil
* }
* }
*/
class Solution {
func hasCycle(_ head: ListNode?) -> Bool {
if head == nil { return false }
var tortoise = head
var hare = head?.next
while true {
if hare == nil { return false }
if tortoise === hare { return true }
tortoise = tortoise?.next
hare = hare?.next?.next
}
}
}