Все темы
49

Сплетаем две отсортированные цепочки в одну

Tier 1Закрыто

Где применяется

1. Задача

Два сервиса присылают тебе по ленте событий. Каждая лента уже упорядочена по времени события. Тому, кто читает ленту, нужна одна общая лента, тоже по порядку. То есть на входе две отсортированные цепочки, а на выходе нужна одна отсортированная.

Самый прямой способ: сложить обе в массив, склеить и отсортировать. Это работает, но не пользуется тем, что каждый вход уже отсортирован. Ты платишь за полную сортировку, которая здесь не нужна, и ещё за память под новый массив.

Обе цепочки уже упорядочены, поэтому их можно сплести, глядя только на два первых узла. Берёшь меньший, переходишь к следующему узлу в той цепочке, откуда взял, и повторяешь. Один проход, без новой сортировки и без нового списка.

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит
Слияние двух отсортированных связных списков
mergeTwoLists(1 → 4 → 5, 2 → 4 → 6 → 8)
список a
список b
уже слито

Сливаем два отсортированных списка в один отсортированный. Результат начинается с фиктивного узла dummy, tail указывает на него.

Как узнать

Слияние и перестройка связного списка (Linked list merge & reorder)

Эти слова в условии значат этот паттерн

  • слить два отсортированных связных списка
  • слить k отсортированных списков
  • перестроить список (чередовать переднюю и заднюю половины)
  • переставить узлы без копирования значений в массив
  • фиктивный головной узел / sentinel

Похоже, но не то

n плюс m узлов дают O(n + m) времени и O(1) памяти. Слияние k списков кучей стоит O(N log k).

На LeetCode

Задачи, где нужно слить отсортированные связные списки, отсортировать связный список или переставить его узлы, разрезав пополам и сплетя половины. Слияние делают фиктивная голова и одно сравнение на узел.

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности