此题的解法可以借鉴归并排序的做法,也体现了分治的思想:
首先实现一个合并两个链表的函数mergeTwoLists;
再将合并lists中所有的链表这个大问题,分解成“合并左部分的一半,再合并右边的一半,最后再进行一次合并”这样的小问题,并且这个小问题还可以继续细分下去,直到变成只需要合并两个链表,这样的步骤可以递归进行实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2){
ListNode* ans = new ListNode(-1);
ListNode* res = ans;
while(l1!=NULL&&l2!=NULL){
if(l1->val<=l2->val){
ListNode* tmp = new ListNode(l1->val);
ans->next = tmp;
l1=l1->next;
}
else{
ListNode* tmp = new ListNode(l2->val);
ans->next = tmp;
l2=l2->next;
}
ans=ans->next;
}
if(l1==NULL) ans->next=l2;
if(l2==NULL) ans->next=l1;
return res->next;
}
ListNode* merge(vector<ListNode*>& lists,int left,int right){
if (left == right) {
return lists[left];
}
int mid = left + (right - left) / 2;
ListNode* node1 = merge(lists, left, mid);
ListNode* node2 = merge(lists, mid + 1, right);
return mergeTwoLists(node1, node2);
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0) return NULL;
else{
return merge(lists,0,lists.size()-1);
}
}
};
来源:CSDN
作者:硬看黑学头秃秃
链接:https://blog.csdn.net/qq_41666768/article/details/104426658