优先队列 (leetcode23)

多个有序链表合并排序

https://leetcode.com/articles/merge-k-sorted-list/#

思路

1.最初版代码中每次比较k组中最小的元素,选择最小的那个。最小的那组指针迭代后继续比较。
2.通过优先队列的方法,每次比较的依旧是k个数,但优先队列采用的是最小堆,所以每次插入的时间复杂度为O(logk),一共要插入的个数为所有元素的个数。时间复杂度为O(nlogk)。
将所有元素按组插入优先队列中时间复杂度为O(nlogn)高于上述方法
3.基础方法merge两个数组。两两merge来减少merge的次数。(此方法未实践)
在这里插入图片描述

关于优先队列

struct cmp{
   bool operator()(ListNode * l1,ListNode * l2)
   {
       return l1->val > l2 -> val;
   }
};
priority_queue<ListNode *,vector<ListNode *> ,cmp >q;
push,pop(没有返回值),top

代码

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
   ListNode* mergeKLists(vector<ListNode*>& lists) {
       ListNode * head = new ListNode(0);
       ListNode * now = head;
       int n = lists.size();
       int min = 0;
       int id = 0;
       bool flag  = false;
       while(1){
           flag = false;
           for(int i = 0; i < n; i ++)
           {
               if(lists[i] == NULL)continue;
               if(!flag)
               {
                   min = lists[i] -> val;
                   id = i;
                   flag = true;
               }
               if(lists[i] -> val < min)
               {
                   id = i;
                   min = lists[i] -> val;
               }
           }
           if(flag == false)break;
           ListNode * neww = new ListNode(min);
           lists[id] = lists[id] -> next;
           now -> next = neww;
           now = now -> next;
       }
       return head -> next;
   }
};
/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
struct cmp{
  bool operator()(ListNode * l1,ListNode * l2)
  {
      return l1->val > l2 -> val;
  }
};
class Solution {
  priority_queue<ListNode *,vector<ListNode *> ,cmp >q;
public:
  ListNode* mergeKLists(vector<ListNode*>& lists) {
      ListNode * head = new ListNode(0);
      ListNode * now = head;
      int n = lists.size();
      
      for(int i = 0; i < n; i ++)
      {
          if(lists[i])
          {
              q.push(lists[i]);
          }
      }
      while(!q.empty())
      {
          ListNode *neww = q.top();
          q.pop();
          now ->next = neww;
          now = now -> next;
          if(neww -> next)
          {
              q.push(neww->next);
          }
      }
      return head -> next;
  }
};

版权声明:本文为weixin_44147606原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。