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

LeetCode 刷题【23. 合并 K 个升序链表】

23. 合并 K 个升序链表

自己做

归并实现1:两两归并

/*** Definition for singly-linked list.* 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 Solution {
public:ListNode* getMerge(ListNode* list1, ListNode* list2){           //两有序链表合并ListNode *p = list1, *q = list2;ListNode *res = new ListNode();ListNode *k = res;while(p != nullptr && q != nullptr){                    //合并两有序if(p->val < q->val){                                //p指向的更小k->next = p;p = p->next;}else{                                                //q指向的更小k->next = q;q = q->next;}k = k->next;                                        //k指向尾部k->next = nullptr;}while(p != nullptr){                                //p没有遍历完k->next = p;p = nullptr;}while(q != nullptr){                                //q没有遍历完k->next = q;q = nullptr;}return res->next;}ListNode* mergeKLists(vector<ListNode*>& lists) {int len = lists.size();                 //有多少个链表if(len == 0)                            //空链表不处理     return nullptr;if(len == 1)                            //只有一个链表,直接返回return lists[0];while(len > 1){lists[1] = getMerge(lists[0],lists[1]); //两个有序链表合并为一个lists.erase(lists.begin());len = lists.size();                     //合并后链表数组的长度更新}return lists[0];}
};

归并实现2:从上往下扫描

/*** Definition for singly-linked list.* 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 Solution {
public:ListNode* mergeKLists(vector<ListNode*>& lists) {int len = lists.size();                 //有多少个链表ListNode* res = new ListNode();ListNode* k = res;//首先消除所有的空链表for (vector<ListNode*>::iterator it = lists.begin(); it != lists.end(); ) {   //从上往下扫描if ((*it) == nullptr) {        //it所指向的空间存放的链表为空it = lists.erase(it);            //消除}elseit++;}len = lists.size();         //更新长度if (len == 0)                        //空链表数组直接返回return nullptr;while (len > 1) {                     //只要是大于两个链表就一直扫描int q = 0;                      //最小值所指向的p索引下标int min = lists[0]->val;            //设置当轮的最小值for (int i = 0; i < len; i++) {   //从上往下扫描if (lists[i]->val < min) {min = lists[i]->val;q = i;}}//扫描结束找到当轮的最小值k->next = lists[q];lists[q] = lists[q]->next;k = k->next;k->next = nullptr;if (lists[q] == nullptr) {        //lists[q]所指向的链表已经完全取完//删除该位置的指针vector<ListNode*>::iterator it = lists.begin();for (int i = 0; i < q; i++)it++;lists.erase(it);//更新长度len = lists.size();}}//此时只剩下一个链表lists[0]k->next = lists[0];return res->next;}
};

看题解

优先队列

class Solution {
public:struct Status {int val;ListNode *ptr;bool operator < (const Status &rhs) const {return val > rhs.val;}};priority_queue <Status> q;ListNode* mergeKLists(vector<ListNode*>& lists) {for (auto node: lists) {if (node) q.push({node->val, node});}ListNode head, *tail = &head;while (!q.empty()) {auto f = q.top(); q.pop();tail->next = f.ptr; tail = tail->next;if (f.ptr->next) q.push({f.ptr->next->val, f.ptr->next});}return head.next;}
};

今日总结

除了归并完全想不到其他方法

http://www.xdnf.cn/news/16865.html

相关文章:

  • MongoDB用户认证authSource
  • 17-C语言:第18天笔记
  • AI 类型的 IDE
  • Cesium 快速入门(六)实体类型介绍
  • 【运维基础】Linux 文件系统基本管理
  • 【Leetcode】2683. 相邻值的按位异或
  • 前缀和-1314.矩阵区域和-力扣(LeetCode)
  • C# 枚举器和迭代器(常见迭代器模式)
  • VBA代码解决方案第二十七讲:禁用EXCEL工作簿右上角的关闭按钮
  • ubuntu22.04系统入门 linux入门 简单命令基础复习 实现以及实践
  • 经典屏保问题 - 华为OD机试真题(Java 题解)
  • pytorch程序语句固定开销分析
  • dubbo源码之消费端启动的高性能优化方案
  • 28. 找出字符串中第一个匹配项的下标
  • C++-2025.7.31
  • 1️⃣4️⃣ OOP:类、封装、继承、多态
  • H.266 vs H.265/AV1/H.264:从工程落地看下一代视频系统的技术演进
  • 第三十一篇 AI的“能力考”:模型评估、保存与加载的艺术【总结前面3】
  • MBR与GPT分区表深度解析:硬盘分区该怎么选?
  • pip库版本升级
  • Android Studio 中Revert Commit、Undo Commit 和 Drop Commit 使用场景
  • Android Studio怎么显示多排table,打开文件多行显示文件名
  • 现在有哪些广泛使用的时序数据库?
  • [免费]基于Python的招聘职位信息推荐系统(猎聘网数据分析与可视化)(Django+requests库)【论文+源码+SQL脚本】
  • [mind-elixir]Mind-Elixir 的交互增强:单击、双击与鼠标 Hover 功能实现
  • Web3.0 和 Web2.0 生态系统比较分析:差异在哪里?
  • 【Datawhale AI夏令营】科大讯飞AI大赛(大模型技术)/夏令营:让AI理解列车排期表(Task3)
  • 【python 获取邮箱验证码】模拟登录并获取163邮箱验证码,仅供学习!仅供测试!仅供交流!
  • uni-app webview的message监听不生效(uni.postmessage is not a function)
  • linux 执行sh脚本,提示$‘\r‘: command not found