/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public var val: Int
 *     public var next: ListNode?
 *     public init() { self.val = 0; self.next = nil; }
 *     public init(_ val: Int) { self.val = val; self.next = nil; }
 *     public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
 * }
 */
class Solution {
    func mergeKLists(_ lists: [ListNode?]) -> ListNode? {
        var lists = lists.filter { $0 != nil }
        let root = ListNode()

        var node = root
        while !lists.isEmpty {
            // find the next list
            var minIdx = 0
            for i in 1..<lists.count {
                if lists[i]!.val < lists[minIdx]!.val {
                    minIdx = i
                }
            }

            // insert the list into the node
            node.next = lists[minIdx]
            node = lists[minIdx]!

            // shift the list at the index or remove it
            if lists[minIdx]!.next == nil {
                lists.remove(at: minIdx)
            } else {
                lists[minIdx] = lists[minIdx]!.next
            }
        }


        return root.next
    }
}