Для неупорядоченных списков ваш заданный трюк, вероятно, один из лучших. Каждая вставка должна быть O (log n), с N необходимыми вставками, и обход будет O (n), давая вам O (N * log n).
Другой вариант - запустить std :: sort для каждого списка по отдельности, а затем просмотреть их параллельно, используя std :: set_union , который удаляет дубликаты для вас. Это также будет O (n * log n), поэтому, если вы беспокоитесь о производительности, вам придется профилировать. Если это не так, делайте, что имеет для вас больше смысла.
Edit:
set_union
будет работать, только если в исходных списках нет дубликатов, в противном случае вам придется использовать sort
, merge
, unique
и erase
. Производительность при больших O все та же, с теми же предостережениями при профилировании.
template <typename container>
container unique_merge(container c1, container c2)
{
std::sort(c1.begin(), c1.end());
std::sort(c2.begin(), c2.end());
container mergeTarget;
std::merge(c1.begin(), c1.end(), c2.begin(), c2.end(),
std::insert_iterator(mergeTarget, mergeTarget.end())
);
std::erase(
std::unique(mergeTarget.begin(), mergeTarget.end()),
mergeTarget.end()
);
return mergeTarget;
}