public ListNode mergeKLists(ListNode[] lists) {
    //handle edge cases
    if(lists.length == 0) return null;
    if(lists.length == 1) return lists[0];
    
    Queue<ListNode> listsQ = new LinkedList<>();
    for(ListNode listi : lists){
        listsQ.add(listi);
    }
    ListNode finalList = null;
    while(listsQ.isEmpty() == false){
        ListNode current = listsQ.poll();
        finalList = mergeTwoLists(finalList, current);
    }
    return finalList;
}
  
  //This function merges two lists.
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
  //edge cases1
  if(l1 == null) return l2;
  if(l2 == null) return l1;
  ListNode prev = new ListNode(-1);//start as a prehead
  ListNode prevHead = prev;
  while(l1 != null & l2 != null){//While there are nodes in both lists
      if(l1.val <= l2.val){
          prev.next = l1;
          l1 = l1.next;
      }else{
          prev.next = l2;
          l2 = l2.next;
      }
      prev = prev.next;
  }
  // at least one of the lists will be left with node/s.
  //we just append whats left of l1 or l2 to prev.
  if(l1 == null){//append list 2
      prev.next = l2;
  }else{//append list 1
      prev.next = l1;
  }
  return prevHead.next;
}