当前位置: 首页 > news >正文

链表OJ(十二)23. 合并 K 个升序链表 困难 优先级队列中存放指针结点

 

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i]升序 排列
  • lists[i].length 的总和不超过 10^4

 对于仿函数的复习
priority_queue 接口使用(仿函数、函数指针解决优先级队列存放自定义类型元素、指针类型元素)_priority queue接口-CSDN博客

 struct ListNode {
     int val;
     ListNode *next;
     ListNode() : val(0), next(nullptr) {}
     ListNode(int x) : val(x), next(nullptr) {}
     ListNode(int x, ListNode *next) : val(x), next(next) {}
 };
 
 class Com {
 public:
     bool operator()(ListNode* left, ListNode* right) {
         return left->val > right->val; 出错点1 大于小于关系判断
     }
 };
 class Solution {
 public:
     ListNode* mergeKLists(vector<ListNode*>& lists) {
         priority_queue<ListNode*, vector<ListNode*>, Com> q;
         for (auto& e : lists)
             if (e)    出错点2 没有对访问的节点进行判空处理
                 q.push(e);
         ListNode* newhead = new ListNode(-1);
         newhead->next = nullptr;
         ListNode* pre = newhead;
         while (!q.empty()) {
             ListNode* cur = q.top();
             q.pop();
             pre->next = cur;
             pre = pre->next;
             cur = cur->next;
             if (cur)
                 q.push(cur);
         }
         return newhead->next;
     }
 };

int main()
{
    Solution s;
    ListNode* l1 = new ListNode(0);
    ListNode* l2 = new ListNode(2);
    ListNode* l3 = new ListNode(3);
    ListNode* l4 = new ListNode(4);
    ListNode* l5 = new ListNode(5);
    l1->next = l2;
    l2->next = l3;
    l3->next = l4;
    l4->next = l5;

    ListNode* p1 = new ListNode(1);
    ListNode* p2 = new ListNode(3);
    ListNode* p3 = new ListNode(6);
    ListNode* p4 = new ListNode(9);
    p1->next = p2;
    p2->next = p3;
    p3->next = p4;


    ListNode* z1 = new ListNode(2);
    ListNode* z2 = new ListNode(3);
    ListNode* z3 = new ListNode(6);
    z1->next = z2;
    z2->next = z3;

    vector<ListNode*> v = { l1, p1, z1 };
    s.mergeKLists(v);
    return 0;
}

相关文章:

  • 什么是预训练语言模型下游任务?
  • 16.3 LangChain Runnable 协议精要:构建高效大模型应用的核心基石
  • LeetCode 27 移除元素
  • Linux(centOS) 命令提示符格式修改(PS1)
  • 数据结构(初阶)(七)----树和二叉树(堆,堆排序)
  • linux基础知识
  • RFID工具柜DW-G104R|智能存储,便捷高效
  • 解决git add . + git commit之后文件状态还是M 问题
  • java后端开发day25--阶段项目(二)
  • 《今日AI-编程-人工智能日报》
  • 130. 被围绕的区域(BFS)
  • 如何利用SpringSecurity进行认证与授权
  • 【数据结构】LRUCache|并查集
  • 计算机毕业设计SpringBoot+Vue.js健身房管理系统(源码+文档+PPT+讲解)
  • AbMole揭秘伤口愈合:IGF-1-SP1-CD248信号通路的新发现
  • Java并发编程之ConcurrentHashMap的原理和使用
  • Windows 11【1001问】查看Windows是否激活的11种方法
  • Java8面试
  • React:B站评论demo,实现列表渲染、删除按钮显示和功能实现、导航栏渲染切换及高亮显示、评论区的排序
  • 高频 SQL 50 题基础版_1667. 修复表中的名字
  • 王晋卿读《酒的精神》︱乏味时代的有味之思
  • 换灯如换脸!西安碑林整修重开观展体验提升
  • 菲律宾华人“钢铁大王”撕票案两主谋被捕,部分赎金已被提取
  • 建筑瞭望|从黄浦江畔趸船改造看航运设施的升级与利用
  • 殷墟出土鸮尊时隔50年首次聚首,北京新展“看·见殷商”
  • 广东一驴友在英德野景点溺亡,家属被爆向21名同伴索赔86万