Слияние двух упорядоченных массивов

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

Короткий ответ

Что ответить на собеседовании

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

Подробный разбор

Ответ с пояснениями

Условие

Даны два массива, элементы которых уже отсортированы. Необходимо получить единый массив, в котором все элементы расположены в порядке возрастания (или неубывания). Ожидаемый итоговый массив: [1, 1, 2, 3, 4, 4]

int[] arrA = {1, 2, 4};
int[] arrB = {1, 3, 4};

Ответ

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

public int[] merge(int[] a, int[] b) {
    int[] result = new int[Math.addExact(a.length, b.length)];
    int i = 0, j = 0, k = 0;
    while (i < a.length && j < b.length) {
        result[k++] = a[i] <= b[j] ? a[i++] : b[j++];
    }
    while (i < a.length) result[k++] = a[i++];
    while (j < b.length) result[k++] = b[j++];
    return result;
}

Предполагаются ненулевые массивы, уже упорядоченные по неубыванию. Время O(n+m), память результата O(n+m). Для примера получается [1,1,2,3,4,4]; исходные массивы не меняются.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее