private ListNode merge(ListNode left, ListNode right) {

        if (left == null) {
            return right;
        }
        if (right == null) {
            return left;
        }

        ListNode temp = new ListNode(0);
        ListNode move = temp;

        /**
         * cause merge sort, every divided minimum part has been sorted first,
         * just need to compare and sort, one part and conquer 
         */
        while (left != null && right != null) {
            if (left.getVal() < right.getVal()) {
                move.setNext(left);
                left = left.getNext();
            } else {
                move.setNext(right);
                right = right.getNext();
            }
            move = move.getNext();
        }

        //if one of the list is not null, just add it up with last node
        if (left != null) {
            move.setNext(left);
        }
        if (right != null) {
            move.setNext(right);
        }

        return temp.getNext();
    }