Обнаружение цикла в связном списке

Дан односвязный список head. Верните true, если в списке есть цикл, и false в противном случае.

Цикл в связном списке существует, если хотя бы один узел может быть посещен повторно, следуя по указателю next.

Ограничения:

  • Длина списка: 1 <= длина <= 1000.
  • Значение узла: -1000 <= Node.val <= 1000.
  • Параметр index (не передается в функцию) определяет индекс начала цикла, если он существует. Если index = -1, цикл отсутствует.

Пример 1:

Input: head = [1, 2, 3, 4], index = 1 Output: true

Пример 2:

Input: head = [1], index = -1 Output: false

Рекомендуемая временная и пространственная сложность

Вам следует стремиться к решению с временной сложностью O(n) и пространственной сложностью O(1) для оптимального подхода.


Подсказка 1

Решение грубой силы заключалось бы в использовании хеш-таблицы для хранения посещенных узлов. Это было бы решение с временной сложностью O(n) и пространственной сложностью O(n). Можете ли вы придумать более эффективный способ?


Подсказка 2

Можно ли использовать два указателя, движущихся с разной скоростью, чтобы обнаружить цикл?


Подсказка 3

Используйте метод "черепахи и зайца" (алгоритм Флойда), чтобы обнаружить цикл без использования дополнительной памяти.

Эта задача проверяет способность эффективно определять наличие цикла в односвязном списке. Она помогает развивать навыки работы с указателями и улучшает понимание временной и пространственной сложности алгоритмов. Решение задачи способствует укреплению логического мышления и способности оптимизировать код для работы с большими объемами данных.

Входные параметры :

head = [1, 2, 3, 4] index = 1

Ожидаемый результат

true