std::list< int > heap_merge( std::vector< std::list< int > >& ls )
{
auto cmp = []( auto& x, auto& y )
{
if( y.empty() ) // x > []
{
return false;
}
if( x.empty() ) // [] > y
{
return true;
}
return x.front() > y.front();
};
make_heap( begin( ls ), end( ls ), cmp );
std::list< int > hr;
for( ;; )
{
pop_heap( begin( ls ), end( ls ), cmp );
auto& m = ls.back();
if( m.empty() )
{
break;
}
hr.push_back( m.front() );
m.pop_front();
push_heap( begin( ls ), end( ls ), cmp );
}
return hr;
}