Объединение двух упорядоченных срезов

Сливайте срезы двумя индексами: сравнивайте текущие элементы и переносите меньший. Для примера получится [1 2 4 5 6 9 11 18 99].

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

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

Сливайте срезы двумя индексами: сравнивайте текущие элементы и переносите меньший. Для примера получится [1 2 4 5 6 9 11 18 99].

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

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

Условие

Необходимо реализовать функцию mergeSorted(a, b []int) []int, которая:

  • принимает два среза целых чисел, уже отсортированных по возрастанию;
  • формирует и возвращает новый срез, содержащий элементы обоих входных срезов в едином порядке возрастания.
import "fmt"

func main() {
    var first = []int{1, 5, 6, 18, 99}
    var second = []int{2, 4, 9, 11}
    fmt.Println(mergeSorted(first, second))
}

func mergeSorted(first []int, second []int) []int {
    // реализация задачи
}

Ответ

Сливайте срезы двумя индексами: сравнивайте текущие элементы и переносите меньший. Для примера получится [1 2 4 5 6 9 11 18 99].

Каждый элемент обрабатывается один раз:

func mergeSorted(first, second []int) []int {
    out := make([]int, 0, len(first)+len(second))
    i, j := 0, 0
    for i < len(first) && j < len(second) {
        if first[i] <= second[j] {
            out = append(out, first[i])
            i++
        } else {
            out = append(out, second[j])
            j++
        }
    }
    out = append(out, first[i:]...)
    out = append(out, second[j:]...)
    return out
}

Время O(len(first)+len(second)), память нового результата того же порядка. Повторы сохраняются, исходные срезы не меняются. Пустой вход допустим: остаток другого среза копируется в результат.

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

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

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

Подробнее