力扣23,合并k的有序链表

力扣23,合并k的有序链表_第1张图片关于优先队列priority_queue的运算符重写,百度到的关于优先队列的用法
解题思路
利用小根堆优先队列分别保存链表数组中每条链表的头结点,然后依次出队,每次出队的结点是三条链表中当前最小的那个结点,将之连到虚拟头结点dummy(指针p)后面,注意出队后要将当前出队结点的下一结点入队,以便下次比较三条结点头结点,同时p也要向后移动。
概括
数组中每条链表依次入队一个结点,出队最小结点,连入虚拟头结点,当队列为空时,完成连接。
遇到的问题
1.优先队列的比较运算符无法比较ListNode*类型的的元素,所以需要重写运算符
priority_queue的三个参数
priority_queue
·typename->数据的类型;
·container->容器类型,vector,queue等;
·functional->比较的方式,(Iess重载小于“<”运算符,构造大顶堆;greater重载大于“>”运算符,构造小顶堆)。
2.出队时不能直接将元素赋值给p,需要新建一个结点node并分配空间,用node来暂存出队元素
3.出队后如果该链表不为空得让下一个结点入队,指针p也要继续前进

class Solution {
public:
    //仿写比较运算符实现greater比较,建立小根堆,大于当前结点下沉
     struct cmp {
        bool operator()(ListNode* a, ListNode* b) {
            return a->val > b->val;
        }
    };
   

    ListNode* mergeKLists(vector<ListNode*>& lists) {
    if(lists.size()==0)//链表数组中没有链表length表示有几条链表
        return nullptr;
        //虚拟头结点
        ListNode* dummy = new ListNode(-1);
        ListNode* p = dummy;
        priority_queue <ListNode*,vector<ListNode*>,cmp> pq ;//建立小根堆
        //将链表数组的每个链表的头结点放进优先队列
        for(auto head : lists){
            if(head)
            pq.push(head);
        }
        while(!pq.empty()){
            //p.next = pq.poll();/*错误,不能直接出来放到链表中,因为还要将出队的链表的下一结点放进pq中比较最小的*/
            ListNode* node = new ListNode();
            node = pq.top();
            pq.pop();
            p->next = node;
            p = p->next;
            
            if(node->next)
                pq.push(node->next);
        }
        return dummy->next;
    }
};

你可能感兴趣的:(数据结构学习,算法)