问题来源: leetcode
问题描述
合并k条有序链表。
问题分析
实际上,我们只需要把这个问题简化为n次两条有序链表的合并,一切就会迎刃而解。真正困难的部分也就是链表归并的代码。两路有序链表归并的思路也不复杂,就是不断的将两条链表中小的元素取出(按照升序)组成一条新的链表。
解决代码
/**
* 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;
while (lists.size() > 1) {
lists.push_back(mergeList(*(lists.begin()), *((lists.begin()+1))));
lists.erase(lists.begin());
lists.erase(lists.begin());
}
return lists[0];
}
ListNode* mergeList(ListNode* l1, ListNode* l2) {
ListNode* tmp = NULL, *tmph = NULL;
while (l1 && l2) {
if (l1->val < l2->val) {
if (!tmp) tmph = tmp = l1;
else {
tmp->next = l1;
tmp = tmp->next;
}
l1 = l1->next;
} else {
if (!tmp) tmph = tmp = l2;
else {
tmp->next = l2;
tmp = tmp->next;
}
l2 = l2->next;
}
}
if (tmp)
tmp->next = l1 ? l1 : l2;
else
tmph = l1 ? l1 : l2;
return tmph;
}
};