合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。
数据范围:节点总数 0≤n≤5000,每个节点的val满足 ∣val∣<=1000
要求:时间复杂度 O(nlogn)
实例:
输入:
[{1,2,3},{4,5,6,7}]
返回值:
{1,2,3,4,5,6,7}
输入:
[{1,2},{1,4,5},{6}]
返回值:
{1,1,2,4,5,6}
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){}
};
class Solution{
public:
ListNode* Merge2(ListNode* pHead1,ListNode* pHead2){
//判断两个链表是否为空.当其中一个为空,返回另外一个
if(!pHead1)
return pHead2;
if(!pHead2)
return pHead1;
//创建一个头结点
ListNode* head=new ListNode(0);
ListNOde* cur=head;
//开始排序(当两个链表都不为空时)
while(pHead1 && pHead2){
if(pHead1->val <= pHead2->val){
cur->next=pHead1;
pHead1=pHead1->next;
}
else{
cur->next=pHead2;
//只移动取值的指针
pHead2=pHead2->next;
}
//指针后移
cur=cur->next;
}
//哪个指针还有剩,直接跟在后
if(pHead1)
cur->next=pHead1;
if(pHead2)
cur->next=pHead2;
//返回值去掉表头
return head->next;
}
//划分合并区间函数
ListNode* divideMerge(vector<ListNode *> &lists, int left, int right){
if(left > right)
return NULL;
//中间一个的情况
else if(left == right)
return lists[left];
//从中间分成两段,再将合并好的两段合并
int mid = (left + right) / 2;
return Merge2(divideMerge(lists, left, mid), divideMerge(lists, mid + 1, right));
}
ListNode *mergeKLists(vector<ListNode *> &lists) {
//k个链表归并排序
return divideMerge(lists, 0, lists.size() - 1);
}
};
其他方法待更