public ListNode mergeKLists(List<ListNode> lists) {

    if (lists.size() == 0) {
      return null;
    }

    if (lists.size() == 1) {
      return lists.get(0);
    }

    List<ListNode> l1 = new ArrayList<ListNode>();
    List<ListNode> l2 = new ArrayList<ListNode>();

    for (int i = 0 ; i < lists.size() ; i++) {
      if (i < lists.size() / 2) {
        l1.add(lists.get(i));
      } else {
        l2.add(lists.get(i));
      }
    }

    ListNode head1 = mergeKLists(l1);
    ListNode head2 = mergeKLists(l2);

    ListNode head = merge(head1, head2);
    return head;
  }