private ListNode merge (ListNode h1, ListNode h2) {
        ListNode    p1  =  h1;
        ListNode    p2  =  h2;
        ListNode    head  =  null;
        ListNode	tail  =  head;
        while ( p1 != null && p2 != null) {
            if ( p1.val > p2.val ) {
                if ( head == null ){
                    head  =  p2;
                    tail  =  p2;
                    ListNode tmp  =  p2.next;
                    p2.next  =  null;
                    p2  =  tmp;
                } else {
                    tail.next = p2;
                    tail  =  tail.next;
                    p2  =  p2.next;
                }
            } else {
                if ( head == null ){
                    head  =  p1;
                    tail  =  p1;
                    ListNode tmp  =  p1.next;
                    p1.next  =  null;
                    p1  =  tmp;
                } else {
                    tail.next = p1;
                    tail  =  tail.next;
                    p1  =  p1.next;
                }
            }
        }
        
        if ( p1 != null ) {
            head  =  append(head, p1 );
        } else {
            head  =  append(head, p2 );
        }
        return head;
    }