스크린샷 2022-10-09 오후 9.12.23.png

스크린샷 2022-10-09 오후 9.12.30.png

스크린샷 2022-10-09 오후 9.12.36.png

스크린샷 2022-10-09 오후 9.12.55.png

  1. 토끼와 거북이는 출발 노드에 같이 선다(head)
  2. 토끼나 거북이가 종점 노드를 만나지 않으면 다음을 반복한다.
    1. 토끼는 두 칸을 전진한다.(중간에 종점 노드를 만나면 사이클이 없다고 리턴한다.)
    2. 거북이는 한 칸을 전진한다.
    3. 토끼와 거북이가 같은 노드에 위치했으면 사이클이 있다고 Return한다.
  3. 토끼나 거북이가 종점 노드를 만났으므로 사이클이 없다고 리턴한다.
/**
 * 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
        }       
    }
}