优先队列合并多个链表(23. 合并 K 个升序链表)

简易版:

合并多个升序数组:

直接将每一行的同一列加入到优先队列,依次取出队头加入新的数组,不断往下一列重复操作。

此题是链表,操作稍微麻烦的是自己定一个类,加入队列的是类,类里面负责存储链表节点的值和指针

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    class Status implements Comparable{
        int val;
        ListNode ptr;

        Status(int val,ListNode ptr){
            this.val = val;
            this.ptr = ptr;
        }
        public int compareTo(Status status2){
            return this.val - status2.val;
        }
    }

    PriorityQueuequeue = new PriorityQueue<>();
    public ListNode mergeKLists(ListNode[] lists) {
        //仅仅是将每一行的链表头节点加入优先队列
        for(var node : lists){
            if(node != null){
                queue.offer(new Status(node.val,node));
            }
        }
        //建立新的链表最为最终结果
        ListNode head = new ListNode(0);
        ListNode tail = head;
        
        //依次取出队头将值最小的节点加入到新链表
        while(!queue.isEmpty()){
            //接下来三步:取出队列最小元素的结构体 将结构体内指针加入新链表,新链表指针后移
            Status tmp = queue.poll();
            tail.next = tmp.ptr;
            tail = tail.next;

            //一行链表的头节点被加入到新的链表 如果此行链表还有,就要将下一个节点作为头结点加入到优先队列
            if(tmp.ptr.next != null){
                queue.offer(new Status(tmp.ptr.next.val,tmp.ptr.next));
            }
        }
        return head.next;
    }
}

/*
做过类似的:他既然是升序的,那我就按列一次次找到最小的添加到新的链表内,此列找完开始下一列
之前做的是合并俩个链表,这是多个链表,而且各个链表长度不一致。
想着就是将每一列头加入优先队列,依次取出最小的加入链表,数据结构好麻烦啊

 */

你可能感兴趣的:(算法笔记,链表,数据结构)