题目:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
题目大意:
给定k条有序链表,求k条链表有序合并后的链表。
思路:
看到这道题感觉蛮亲切的,因为已经不止一次遇到链表有序合并的问题了,所以思路还是有的。
第一个思路就是借助两个链表的合并,先将两个链表合并为结果链表,然后再将下一条链表合并到结果链表上,直到所有的链表都合并结束。
当然,第一个思路的时间复杂度很高,所以肯定又是轰轰烈烈的超时了。所以,诞生了第二个思路:根据合并排序的思想,将链表从头和尾合并,每次合并之后都放在原来链表数组的前半部分,下一次循环直接合并前半部分,直到所有的链表合并完成。
代码1:
//每次合并一个链表到结果链表上,结果超时
class Solution {
public:
ListNode* mergeKLists(std::vector<ListNode*>& lists) {
ListNode *result = nullptr;
const int size = lists.size();
if (size == 0) {
return result;
} else if (size == 1) {
return lists[0];
}
result = lists[0];
for (int i = 1; i < size; ++i) {
result = mergeTwoLists(result, lists[i]);
}
return result;
}
private:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) //合并两个数组
{
ListNode *result = new ListNode(0);
ListNode *p1 = l1;
ListNode *p2 = l2, *tail = result;
while (p1 && p2) {
if (p1->val <= p2->val) {
tail->next = p1;
p1 = p1->next;
} else {
tail->next = p2;
p2 = p2->next;
}
tail = tail->next;
}
if (p1) {
tail->next = p1;
p1 = p1->next;
}
if (p2) {
tail->next = p2;
p2 = p2->next;
}
tail = result;
result = tail->next;
delete(tail);
return result;
}
};
代码2:
class Solution {
public:
ListNode* mergeKLists(std::vector<ListNode*>& lists) {
const int size = lists.size();
if (size == 0) {
return nullptr;
}
int right = size - 1;
while (right > 0) {
int left = 0;
while (left < right) {
lists[left] = mergeTwoLists(lists[left], lists[right]);
++left;
--right;
}
}
return lists[0];
}
private:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2)
{
ListNode *result = new ListNode(0);
ListNode *p1 = l1;
ListNode *p2 = l2, *tail = result;
while (p1 && p2) {
if (p1->val <= p2->val) {
tail->next = p1;
p1 = p1->next;
} else {
tail->next = p2;
p2 = p2->next;
}
tail = tail->next;
}
if (p1) {
tail->next = p1;
p1 = p1->next;
}
if (p2) {
tail->next = p2;
p2 = p2->next;
}
tail = result;
result = tail->next;
delete(tail);
return result;
}
};