您的位置:首页 > 其它

Merge k Sorted Lists(leetcode)

2017-09-24 11:19 120 查看

Merge k Sorted Lists

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;
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: