当前位置:   article > 正文

合并K个升序链表

合并K个升序链表

目录

题目

解法一

思想

代码

解法二

思想

代码


题目

解法一

优先级队列

思想

将每个链表中的一个节点存放到优先级队列中,本题采用小根堆,将小根堆中的根节点取出,插入到最终的链表中,并且将该节点在原链表中的下一个节点插入小根堆中(需要向下调整),直到堆中没有节点为止(即所以链表都已经合并完)。

代码
  1. class Solution {
  2. public:
  3. struct Less{
  4. bool operator()(ListNode* l1,ListNode* l2){
  5. return l1->val > l2->val;
  6. }
  7. };
  8. ListNode* mergeKLists(vector<ListNode*>& lists) {
  9. ListNode* node=new ListNode(0);
  10. ListNode* cur=node;
  11. priority_queue<ListNode*,vector<ListNode*>,Less> q;
  12. for(auto& it:lists){
  13. if(it) q.push(it);
  14. }
  15. while(!q.empty()){
  16. ListNode* tmp=q.top();
  17. q.pop();
  18. cur->next=tmp;
  19. if(tmp->next) q.push(tmp->next);
  20. cur=cur->next;
  21. }
  22. return node->next;
  23. }
  24. };
解法二

归并/分治

思想

将链表两两进行合并,直到合并为一个链表为止。

代码
  1. class Solution {
  2. public:
  3. ListNode* mergeKLists(vector<ListNode*>& lists) {
  4. return mergeL(lists,0,lists.size()-1);
  5. }
  6. ListNode* mergeL(vector<ListNode*>& lists,int l,int r){
  7. if(l>r) return nullptr;
  8. if(l==r) return lists[l];
  9. int mid=(l+r)>>1;
  10. ListNode* l1=mergeL(lists,l,mid);
  11. ListNode* l2=mergeL(lists,mid+1,r);
  12. return merge2L(l1,l2);
  13. }
  14. ListNode* merge2L(ListNode* l1,ListNode* l2){
  15. if(l1==nullptr) return l2;
  16. if(l2==nullptr) return l1;
  17. if(l1->val < l2->val){
  18. l1->next=merge2L(l1->next,l2);
  19. return l1;
  20. }
  21. else{
  22. l2->next=merge2L(l1,l2->next);
  23. return l2;
  24. }
  25. }
  26. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/960057
推荐阅读
相关标签
  

闽ICP备14008679号