Algorithm 2 Mergable Heap Implemented with Unsorted List

1:procedure MakeHeap()

2:Let LL be an empty doubly linked list with a sentinel node, i.e. L.nil.prev=L.nil.next=L.nilL.nil.prev = L.nil.next = L.nil

3:return LL

4:end procedure

5:

6:procedure Insert(L,xL, x)

7:x.prev=L.nilx.prev = L.nil

8:x.next=L.nil.nextx.next = L.nil.next

9:L.nil.next.prev=xL.nil.next.prev = x

10:L.nil.next=xL.nil.next = x

11:end procedure

12:

13:procedure Minimum(LL)

14:if L.nil.next=L.nilL.nil.next = L.nil then

15:return L.nilL.nil

16:end if

17:x=L.nil.nextx = L.nil.next

18:p=xp = x

19:while pL.nilp \ne L.nil do

20:if p.key<x.keyp.key < x.key then

21:x=px = p

22:end if

23:p=p.nextp = p.next

24:end while

25:return xx

26:end procedure

27:

28:procedure ExtractMin(LL)

29:x=x = Minimum(LL)

30:if xL.nilx \ne L.nil then

31:x.prev.next=x.nextx.prev.next = x.next

32:x.next.prev=x.prevx.next.prev = x.prev

33:end if

34:return xx

35:end procedure

36:

37:procedure Union(L1,L2L_1, L_2)

38:L1.nil.prev.next=L2.nil.nextL_1.nil.prev.next = L_2.nil.next

39:L2.nil.next.prev=L1.nil.prevL_2.nil.next.prev = L_1.nil.prev

40:L2.nil.prev.next=L1.nilL_2.nil.prev.next = L_1.nil

41:L1.nil.prev=L2.nil.prevL_1.nil.prev = L_2.nil.prev

42:return L1L_1

43:end procedure