Categorías
Algorithms

LeetCode – Fusionar k listas ordenadas (Java)

Fusionar k listas enlazadas ordenadas y devolverlas como una lista ordenada. Analiza y describe su complejidad.

Análisis

La solución más simple es utilizar PriorityQueue. Los elementos de la cola de prioridad se ordenan según su orden natural, o mediante un comparador proporcionado en el momento de la construcción (en este caso).

Solución Java

public ListNode mergeKLists(ListNode[] lists) {
    if(lists==null||lists.length==0)
        return null;
 
    PriorityQueue<ListNode> queue = new PriorityQueue<ListNode>(new Comparator<ListNode>(){
        public int compare(ListNode l1, ListNode l2){
            return l1.val - l2.val;
        }
    });
 
    ListNode head = new ListNode(0);
    ListNode p = head;
 
    for(ListNode list: lists){
        if(list!=null)
            queue.offer(list);
    }    
 
    while(!queue.isEmpty()){
        ListNode n = queue.poll();
        p.next = n;
        p=p.next;
 
        if(n.next!=null)
            queue.offer(n.next);
    }    
 
    return head.next;
 
}

Tiempo: log (k) * n.
k es el número de lista y n es el número de elementos totales.

Además, la definición del comparador de Java 8 se puede simplificar de la siguiente manera:

Comparator<ListNode> comp = Comparator.comparing(ListNode->ListNode.val);
PriorityQueue<ListNode> queue = new PriorityQueue<>(comp);

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *