LeetCode23 合併k個排序連結串列
阿新 • • 發佈:2020-07-25
合併k個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。
第一種方法,連續對連結串列做兩兩合併,時間複雜度和空間複雜度如下:
第二種方法,歸併法,每次合併相鄰的兩個連結串列
第三種方法,優先佇列。先把k個連結串列頭壓入,然後每次取出val最小的指標,然後壓入下一個。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {}7 * }; 8 */ 9 10 struct Status{ 11 int val; 12 ListNode* ptr; 13 bool operator< (const Status &comp) const{ 14 return val>comp.val; 15 } 16 }; 17 18 class Solution { 19 public: 20 ListNode* mergeKLists(vector<ListNode*>& lists) { 21 priority_queue<Status> q;22 for(auto node:lists){ 23 if(node!=nullptr) 24 q.push({node->val,node}); 25 } 26 ListNode head,*tail=&head; 27 while(!q.empty()){ 28 auto temp=q.top(); 29 q.pop(); 30 if(temp.ptr->next!=nullptr)31 q.push({temp.ptr->next->val,temp.ptr->next}); 32 tail->next=temp.ptr; 33 tail=tail->next; 34 } 35 return head.next; 36 } 37 };