题目描述:
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
解题思路:
1、按照正常的思路,先定义一个合并两个链表的函数,在将数组中的链表两两合并。
代码如下:
class Solution {
public:
ListNode* merge(ListNode* l1,ListNode* l2){//定义一个合并两个排序链表的函数
if(!l1)return l2;
if(!l2)return l1;
if(l1->val < l2->val){
l1->next = merge(l1->next,l2);
return l1;
}else{
l2->next = merge(l1,l2->next);
return l2;
}
}
ListNode* mergeKLists(vector<ListNode*>& lists) {//将链表两两进行合并
ListNode* p = nullptr;
for(int i=0;i<lists.size();i++){
p = merge(p,lists[i]);
}
return p;
}
};
2、借用优先队列,将所有的节点压到优先队列中,再将链表组合起来(小顶堆)
class Solution {
public:
//优先队列
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<int,vector<int>,greater<int>> q;
for(int i=0;i<lists.size();i++){
ListNode* temp = lists[i];
while(temp){
q.push(temp->val);
temp = temp->next;
}
}
if(q.empty())return nullptr;
ListNode* head=new ListNode(q.top());
q.pop();
ListNode* p = head;
while(!q.empty()){
ListNode* temp = new ListNode(q.top());
p->next = temp;
p = temp;
q.pop();
}
return head;
}
};
3、使用归并排序,将数组(数组里面存放的是有个链表)首先进行分割,再一次归并即可。
class Solution {
public:
//归并排序
ListNode* merge(ListNode* l1,ListNode* l2){
if(!l1)return l2;
if(!l2)return l1;
if(l1->val<l2->val){
l1->next = merge(l1->next,l2);
return l1;
}else{
l2->next = merge(l1,l2->next);
return l2;
}
}
ListNode* merge(vector<ListNode*>& lists,int left,int right){
if(left>=right)return lists[left];
int mid = (right+left)/2;
ListNode* l1 = merge(lists,left,mid);
ListNode* l2 = merge(lists,mid+1,right);
return merge(l1,l2);
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0)return nullptr;
return merge(lists,0,lists.size()-1);
}
};