题目描述:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路分析:
利用辅助空间求解,用最大堆来存链表中的每个节点,再一次一次从堆中取出,建表。
需要注意输入的链表可能全为空,所以建完堆后,需要先判断一次堆是否为空,若为空,则直接输出空。
代码:
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 class Solution { 10 public: 11 ListNode* mergeKLists(vector<ListNode*>& lists) { 12 if(lists.size()==0) 13 return nullptr; 14 priority_queue<int> q; 15 int k=lists.size(); 16 for(int i=0; i<k; i++) 17 { 18 ListNode* cur = lists[i]; 19 while(cur) 20 { 21 q.push(cur->val); 22 cur = cur->next; 23 } 24 } 25 if(q.empty()) 26 return nullptr; 27 // ListNode* res = new ListNode(0); 28 ListNode* pre = new ListNode(q.top()); 29 q.pop(); 30 while(!q.empty()) 31 { 32 ListNode* tmp = new ListNode(q.top()); 33 q.pop(); 34 tmp->next = pre; 35 pre = tmp; 36 } 37 return pre; 38 } 39 };