\begin{algorithm}
\caption{Mergable Heap Implemented with Unsorted List}
\begin{algorithmic}
\PROCEDURE{MakeHeap}{}
\STATE Let $L$ be an empty doubly linked list with a sentinel node,
i.e. $L.nil.prev = L.nil.next = L.nil$
\RETURN $L$
\ENDPROCEDURE
\STATE
\PROCEDURE{Insert}{$L, x$}
\STATE $x.prev = L.nil$
\STATE $x.next = L.nil.next$
\STATE $L.nil.next.prev = x$
\STATE $L.nil.next = x$
\ENDPROCEDURE
\STATE
\PROCEDURE{Minimum}{$L$}
\IF{$L.nil.next = L.nil$}
\RETURN $L.nil$
\ENDIF
\STATE $x = L.nil.next$
\STATE $p = x$
\WHILE{$p \ne L.nil$}
\IF{$p.key < x.key$}
\STATE $x = p$
\ENDIF
\STATE $p = p.next$
\ENDWHILE
\RETURN $x$
\ENDPROCEDURE
\STATE
\PROCEDURE{ExtractMin}{$L$}
\STATE $x =$ \CALL{Minimum}{$L$}
\IF{$x \ne L.nil$}
\STATE $x.prev.next = x.next$
\STATE $x.next.prev = x.prev$
\ENDIF
\RETURN $x$
\ENDPROCEDURE
\STATE
\PROCEDURE{Union}{$L_1, L_2$}
\STATE $L_1.nil.prev.next = L_2.nil.next$
\STATE $L_2.nil.next.prev = L_1.nil.prev$
\STATE $L_2.nil.prev.next = L_1.nil$
\STATE $L_1.nil.prev = L_2.nil.prev$
\RETURN $L_1$
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}