1. 程式人生 > 實用技巧 >LeetCode23 合併k個排序連結串列

LeetCode23 合併k個排序連結串列

合併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 };