Склейка журналов двух роботов

тема: Два указателя · уровень: базовый

Условие

В мастерской два робота ведут журналы событий. Каждый робот записывает номера «тиков» (целые числа), когда у него что-то произошло. Внутри одного журнала записи уже идут по неубыванию.

Диспетчеру нужен единый журнал: все тики из обоих журналов, тоже по неубыванию. Если одинаковый тик встречается у обоих роботов или несколько раз у одного — в итоговом журнале он должен встретиться столько же раз.

Формат ввода

В первой строке дано целое число m — количество записей в журнале первого робота. Во второй строке дано m целых чисел a1..am в неубывающем порядке. В третьей строке дано целое число n — количество записей в журнале второго робота. В четвёртой строке дано n целых чисел b1..bn в неубывающем порядке.

Формат вывода

Выведите m+n целых чисел — объединённый журнал в неубывающем порядке.

Ограничения

Пример

Ввод:

4
-2 0 3 3
3
-5 3 10

Вывод:

-5 -2 0 3 3 3 10

Как решать — идея подхода

Приём: Два указателя (слияние отсортированных массивов)

Ключевое наблюдение: оба журнала уже отсортированы. Значит, чтобы получить общий отсортированный список, не нужно ничего «пересортировывать» — достаточно аккуратно сливать их, как в merge sort.

Приём: два указателя. Держим позиции i в первом массиве и j во втором. В каждый момент минимальный из ещё не взятых тиков — это либо a[i], либо b[j]. Берём меньший и двигаем соответствующий указатель. Если значения равны — можно брать любой (например, из a), а второй такой же тик попадёт позже, когда сравнение дойдёт до него. Так автоматически сохраняются все повторы.

План:

Мини-сниппет сравнения: if a[i] <= b[j]: take a[i], i += 1 else: take b[j], j += 1

Сложность: O(m + n) по времени, потому что каждый указатель двигается только вперёд, и O(m + n) по памяти для ответа.

Частая ошибка: при a[i] == b[j] делать i += 1 и j += 1 одновременно — так вы потеряете один из повторов. Нужно добавлять элементы по одному.

Разберись руками

Есть два отсортированных журнала тиков: A = [-2, 0, 3, 3] и B = [-5, 3, 10]. Нужно получить один общий журнал, тоже по возрастанию, не теряя повторы.

Идея: Держим два указателя на первых ещё не использованных элементах двух отсортированных журналов. Сравниваем текущие числа, выписываем меньшее (при равенстве можно взять из первого), и сдвигаем указатель только в том журнале, откуда взяли число. Когда один журнал закончился — дописываем оставшиеся числа второго.

Решить задачу с автопроверкой на Python →

Куда дальше