Merge k Sorted Lists
题目
leetcode题目
Merge k sorted linked lists and return it as one sorted list.
将已知的K个有序链表合并成1个有序链表。
解决
想法:采用分治算法,先将两个两个链表合并,直到链表只剩一个,此时就能够得到结果。
两个链表合并,可以参考数据库的“两路归并外排序”,每次取两个链表的表头a
、b
,比较其大小。假设a < b
,则将节点a
加进合并链表中,节点b
和节点a->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.empty()) {
return NULL;
}
while (true) {
if (lists.size() == 1) { // 表示K个链表已经合并完
break;
}
ListNode* result = merge2Lists(lists[0], lists[1]); // 确定合并链表的头节点
lists.erase(lists.begin()); // 删除已经合并完的子链表
lists.erase(lists.begin());
lists.push_back(result); // 将合并链表加进vector中,等待下一次合并
}
return *(lists.begin());
}
ListNode* merge2Lists(ListNode* l, ListNode* r) {
/* 返回值是需要加进合并链表的节点 */
if (l == NULL) {
return r;
}
if (r == NULL) {
return l;
}
if (l->val >= r->val) {
r->next = merge2Lists(l, r->next);
return r;
} else {
l->next = merge2Lists(l->next, r);
return l;
}
}
};