方法一:归并法
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if (lists.empty()) return NULL;
int n = lists.size();
while (n > 1) {
int k = (n + 1) / 2;
for (int i = 0; i < n / 2; ++i) {
lists[i] = mergeTwoLists(lists[i], lists[i + k]);
}
n = k;
}
return lists[0];
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *dummy = new ListNode(-1), *cur = dummy;
while (l1 && l2) {
if (l1->val < l2->val) {
cur->next = l1;
l1 = l1->next;
} else {
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
if (l1) cur->next = l1;
if (l2) cur->next = l2;
return dummy->next;
}
};
方法二:最小堆
class Compare {
public:
bool operator()(ListNode* p1, ListNode* p2) {
return p1->val > p2->val;
}
};
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*, vector<ListNode*>, Compare > que;
int k = lists.size();
for (int i = 0; i < k; ++i) {
if (lists[i] != NULL) //排除空表的情况
que.push(lists[i]);
}
//新建一个头结点,方便处理
ListNode* pHead = new ListNode(-1);
ListNode* pCur = pHead;
while (!que.empty()) {
//取最小
ListNode *tmp = que.top();
que.pop();
//加入新序列
pCur->next = tmp;
pCur = pCur->next;
//新元素入堆
if (tmp->next != NULL) {
que.push(tmp->next);
}
}
pCur = pHead->next;
delete pHead; //删除头结点
return pCur;
}
};