Объединить массивы без дубликатов

42. Объединить два списка без дубликатов

Условие задачи:
Необходимо объединить два списка целых чисел, исключив повторяющиеся элементы.

Код:

public List<Integer> collect(List<Integer> lst1, List<Integer> lst2) {
    // код тут
}

Спойлеры к решению

Подсказки
💡 Для удаления дубликатов можно использовать Set.
💡 LinkedHashSet сохраняет порядок первого появления элементов.
💡 Через Stream API можно использовать Stream.concat() и distinct().
💡 Если элементы должны быть отсортированы, подойдёт TreeSet.

Решение

Вариант с LinkedHashSet:

public List<Integer> collect(
        List<Integer> lst1,
        List<Integer> lst2
) {
    Set<Integer> uniqueValues = new LinkedHashSet<>();

    uniqueValues.addAll(lst1);
    uniqueValues.addAll(lst2);

    return new ArrayList<>(uniqueValues);
}

LinkedHashSet удаляет дубликаты и сохраняет порядок первого появления элементов.

Вариант через Stream API:

public List<Integer> collect(
        List<Integer> lst1,
        List<Integer> lst2
) {
    return Stream.concat(
                    lst1.stream(),
                    lst2.stream()
            )
            .distinct()
            .collect(Collectors.toList());
}

Оба решения проходят по элементам входных списков и имеют линейную сложность в среднем.

Для объединения списков без дубликатов можно использовать LinkedHashSet или объединить два потока через Stream.concat() и вызвать distinct().