题目描述
出处https://leetcode.com/problems/merge-k-sorted-lists/description/
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
分析
这道题的主要考点是对多个链表进行从大到小排序,用两种方法解决
方法一: 直接利用循环,循环的次数等于所有列表内数字数量,每次循环从所有列表中找出最小数字,将其添加在所求列表中,直到所有列表均到达结尾退出循环,得到最终列表。
方法二:利用分治算法的思想,将k个列表排序问题,分解为k/2个列表排序问题,经过多次分解,最终分解为2个列表排序问题,达到简化运算的效果。
最终结果
方法一:
/**
* 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;
if (lists.size() == 1)
return lists[0];
int n = 0;
ListNode *res = new ListNode(0);
ListNode *list = res;
while (n < lists.size()) {
int num = -1;
for (int i = 0;i < lists.size(); i++) {
if (lists[i] != NULL && num == -1) {
num = i;
}
if (lists[i] != NULL && lists[num]->val > lists[i]->val) {
num = i;
}
}
if (num != -1) {
list->next = lists[num];
list = list->next;
lists[num] = lists[num]->next;
}
if (lists[num] == NULL || num == -1)
n++;
}
return res->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;
return merge(0, lists.size()-1, lists);
}
ListNode* merge(int start, int end, vector<ListNode*>& lists) {
if (start == end) return lists[start];
if (start > end) return NULL;
int mid = (start + end) / 2;
ListNode* left = merge(start, mid, lists);
ListNode* right = merge(mid+1, end, lists);
ListNode* res = new ListNode(0);
ListNode* list = res;
while (left != NULL && right != NULL) {
if (left->val > right->val) {
list->next = right;
list = list->next;
right = right->next;
} else {
list->next = left;
list = list->next;
left = left->next;
}
}
if (left == NULL && right != NULL) {
list->next = right;
} else if (left != NULL && right == NULL) {
list->next = left;
}
return res->next;
}
};