class ListMergerInterface {
virtual std::list<T> merge(std::vector<std::list<T>>& lists) = 0;
virtual std::list<T> merge(std::vector<std::list<T>>&& lists) = 0;
class ListMerger: private ListMergerInterface<T> {
template<typename U, typename Comp>
using MinHeap = std::priority_queue<U, std::vector<U>, Comp>;
std::list<T> merge(std::vector<std::list<T>>&& lists) override {
std::list<T> merge(std::vector<std::list<T>>& lists) override {
using ListIterator = std::list<T>::const_iterator;
auto heapComp = [](auto const& a, auto const& b) { return *std::get<0>(a) > *std::get<0>(b); };
MinHeap<std::pair<ListIterator, int>, decltype(heapComp)> heap(heapComp);
std::ranges::for_each(lists | std::views::enumerate, [&](auto enumeratedList) {
auto [index, list] = enumeratedList;
heap.emplace(list.cbegin(), index);
auto [curIt, index] = heap.top();
auto nextIt = std::next(curIt);
if (nextIt != lists[index].cend()) {
heap.emplace(nextIt, index);
mergedList.splice(mergedList.cend(), lists[index], curIt);
ListMerger<int> listMerger;
std::vector<std::list<int>> v = {std::list {1, 4, 7, 10}, std::list {3, 5, 6}, std::list {2, 8, 9}};
auto mergedList = listMerger.merge(v);
for (auto num : mergedList) {
std::cout << std::format("{} ", num);