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;
}