141. Linked List Cycle (Easy) (https://leetcode.com/problems/linked-list-cycle/description/)

Дан head — голова связного списка. Определите, содержит ли связный список цикл. В связном списке есть цикл, если существует узел, к которому можно снова прийти, непрерывно следуя по указателю next. Внутренне используется pos для обозначения индекса узла, к которому подключён указатель next хвостового узла. Обратите внимание, что pos не передаётся как параметр. Верните true, если в связном списке есть цикл. В противном случае верните false. Ограничения: - Количество узлов в списке находится в диапазоне [0, 10

  • -10^5 <= Node.val <= 10^5 - pos равен -1 или является допустимым индексом в связном списке. Дополнительное задание: Сможете ли вы решить эту задачу, используя O(1) (то есть константную) память?
class ListNode {
  val: number
  next: ListNode | null
  constructor(val?: number, next?: ListNode | null) {
    this.val = val === undefined ? 0 : val
    this.next = next === undefined ? null : next
  }
}
 
function hasCycle(head: ListNode | null): boolean {
  // Floyd's Cycle Detection
  let slow: ListNode | null = head
  let fast: ListNode | null = head
 
  while (fast !== null && fast.next !== null) {
    slow = slow!.next
    fast = fast.next.next
    if (fast === slow) return true
  }
 
  return false
}
 
function toList(arr: number[], pos: number): ListNode | null {
  if (arr.length === 0) return null
  const nodes = arr.map((v) => new ListNode(v))
  for (let i = 0; i < nodes.length - 1; i++) {
    nodes[i].next = nodes[i + 1]
  }
  if (pos >= 0 && pos < nodes.length) {
    nodes[nodes.length - 1].next = nodes[pos]
  }
  return nodes[0]
}
 
// Локальная проверка:
console.log(hasCycle(toList([3, 2, 0, -4], 1))) // true
console.log(hasCycle(toList([1, 2], 0))) // true
console.log(hasCycle(toList([1], -1))) // false
console.log(hasCycle(toList([], -1))) // false
console.log(hasCycle(toList([1, 2, 3, 4, 5], -1))) // false
console.log(hasCycle(toList([1, 2, 3, 4, 5], 4))) // true (tail → last node itself)
Пример 1:
 
    Вход: head = [3,2,0,-4], pos = 1
    Выход: true
    Объяснение: В связном списке есть цикл, где хвост соединяется с 1-м узлом (индексация с 0).
 
Пример 2:
 
    Вход: head = [1,2], pos = 0
    Выход: true
    Объяснение: В связном списке есть цикл, где хвост соединяется с 0-м узлом.
 
Пример 3:
 
    Вход: head = [1], pos = -1
    Выход: false
    Объяснение: В связном списке нет цикла.

hash-table 876 — тот же fast & slow pointer patterns leetcode