方法一:
递归调用,找到当前最小的节点返回,同时此节点的next指向递归调用本函数的结果,然后递归调用函数再将当前递归中最小的结点的返回。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if (lists.size() == 0)
return NULL;
int noEmptyNums = 0;
for (int i = 0; i < lists.size();) {
if (lists[i]) {
noEmptyNums++;
i++;
}
else
lists.erase(lists.begin() + i);//出现空链表就删除,同时后续的链表统一前移补位;
}
if (noEmptyNums == 0)
return NULL;
if (lists.size() == 1)
return lists[0];
ListNode* head;
int minIndex = 0;
for (int i = 1; i < lists.size(); i++) {
if (lists[i]->val < lists[minIndex]->val)
minIndex = i;
}
head = lists[minIndex];
lists[minIndex] = lists[minIndex]->next;
head->next = mergeKLists(lists);
return head;
}
};
方法二:
分治法
作者:LeetCode
链接:https://leetcode-cn.com/problems/two-sum/solution/he-bing-kge-pai-xu-lian-biao-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
ListNode* mergeCore(ListNode* l1, ListNode* l2) {
if (!l1 && !l2) return NULL;
if (l1 && !l2) return l1;
if (!l1 && l2) return l2;
ListNode* head;
if (l1->val < l2->val) {
head = l1;
head->next = mergeCore(l1->next, l2);
} else {
head = l2;
head->next = mergeCore(l1, l2->next);
}
return head;
}
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
int len = lists.size();
if (len == 0)
return NULL;
int interval = 1;
while (interval < len) {
for (int i = 0; i < (len-interval); i += (interval * 2)) {
lists[i] = mergeCore(lists[i], lists[i + interval]);
}
interval *= 2;
}
return lists[0];
}
};