type List { int data; List next; } endtype decl List head; List mergeSort(List top); List merge(List a, List b); enddecl List mergeSort(List top) { decl List slow, fast, a, b; enddecl begin if((top!=null) AND (top.next!=null)) then slow=top; fast=top.next; //Divide the list into two parts while(fast!=null) do fast=fast.next; if(fast!=null) then slow=slow.next; fast=fast.next; endif; endwhile; a=top; b=slow.next; slow.next=null; //Recursively call merge sort a=mergeSort(a); b=mergeSort(b); //Merge the two lists top=merge(a, b); endif; return top; end } List merge(List a, List b) { decl List result; enddecl begin result=null; if(a==null) then result=b; endif; if(b==null) then result=a; endif; if(a!=null AND b!=null) then if(a.data<=b.data) then result=a; result.next=merge(a.next, b); else result=b; result.next=merge(a, b.next); endif; endif; return result; end } int main() { decl int x, counter; List p, q; enddecl begin x = initialize(); //Storing values in descending order head=null; counter=0; while(counter<64) do p=alloc(); p.data=64-counter; p.next=null; if(head==null) then head=p; q=p; else q.next=p; q=q.next; endif; counter=counter+1; endwhile; //Calling Merge Sort head=mergeSort(head); //Printing Values p=head; while(p!=null) do write(p.data); p=p.next; endwhile; return 1; end }