Leetcode 23. 合并K个升序链表merge-k-sorted-lists(合并k路有序链表 最小堆)
题目描述
合并k个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:合并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: // 优先级队列默认是大根堆,所以a>b生成小根堆 struct comp{ bool operator()(ListNode* a,ListNode* b){ return a->val>b->val; } }; ListNode* mergeKLists(vector<ListNode*>& lists) { priority_queue<ListNode*,vector<ListNode*>,comp> q; int n=lists.size(); int count=0; // 放入元素时要判断是否有链表为空 for(int i=0;i<n;++i){ if(lists[i]!=nullptr){ q.push(lists[i]); count++; } } ListNode head(0); ListNode* p=&head; // 遍历知道堆中元素为空 while(q.size()>0){ ListNode* node=q.top(); q.pop(); p->next=node; p=p->next; ListNode* next=node->next; if(next!=nullptr) q.push(next); } return head.next; } };
2、使用sort排序
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: static bool cmp(const ListNode *l1, const ListNode *l2) { return l1->val<l2->val; } ListNode *mergeKLists(vector<ListNode *> &lists) { int n = lists.size(); ListNode *res = new ListNode(-1); if (n<1) return res->next; if (n<2) return lists[0]; ListNode *p = res; int m = 0; for(int i=0;i<n;++i) { if(lists[i]==NULL) { swap(lists[m],lists[i]); m++; } } while(m < n-1) { sort(lists.begin()+m,lists.end(),cmp); p->next=lists[m]; p=p->next; lists[m]=lists[m]->next; if(lists[m]==NULL) { m++; } } if(lists[m]!=NULL) p->next=lists[m]; return res->next; } };
3、使用手写堆排序
class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { vector<ListNode*> stack; int length = lists.size(); int n=0; for(int i=0;i<length;++i){ if (lists[i]!=nullptr){ stack.push_back(lists[i]); n++; } } build(stack, n); ListNode head; ListNode* p = &head; while(n>0){ fix(stack,n,0); p->next = stack[0]; p=p->next; stack[0]=stack[0]->next; if(stack[0]==nullptr){ swap(stack[0],stack[n-1]); --n; } } return head.next; } void fix(vector<ListNode*>& lists, int n, int i){ int j=i*2+1; ListNode* tmp=lists[i]; while(j<n){ if(j+1<n&&lists[j+1]->val<lists[j]->val) j=j+1; if(tmp->val<lists[j]->val) break; lists[i]=lists[j]; i=j; j=i*2+1; } lists[i]=tmp; } void build(vector<ListNode*>& lists, int n) { for(int i=n/2-1;i>=0;--i){ fix(lists,n,i); } } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
分类:
leetcode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2016-04-28 git push ERROR: missing Change-Id in commit message footer
2016-04-28 Android各种屏幕适配原理