题目
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法
利用队列来模拟归并排序
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
利用队列来模拟归并排序 **** 时间复杂度 N * log K
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size() == 0)
return NULL;
else if(lists.size() == 1)
return lists[0];
else {
queue<ListNode*> re_queue;
for(auto pi = lists.begin() ; pi != lists.end();pi++)
re_queue.push(*pi);
while(re_queue.size() >= 2)
{
ListNode *l1 = re_queue.front();
re_queue.pop();
ListNode *l2 = re_queue.front();
re_queue.pop();
l1 = mergeTwo(l1,l2);
re_queue.push(l1);
}
return re_queue.front();
}
}
ListNode *mergeTwo(ListNode *l1, ListNode *l2)
{
if(l1 == NULL)
return l2;
else if(l2 == NULL)
return l1;
else {
if(l1->val > l2->val)
{
l2->next = mergeTwo(l1,l2->next);
return l2;
}
else {
l1->next = mergeTwo(l1->next,l2);
return l1;
}
}
}
};