题目描述
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
}
};
解
- 之前已经尝试过合并两个有序链表了,直接类似这个来一个暴力解法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* res;
if(lists.size()==0){return nullptr;}
if(lists.size()==1){return lists[0];}else{
res = mergeTwoLists(lists[0],lists[1]);
}
if(lists.size()>2){
for(int i=2;i<lists.size();i++){
res = mergeTwoLists(lists[i],res);
}
}
return res;
}
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1 == NULL){return list2;}
if(list2 == NULL){return list1;}
ListNode* point =nullptr;
if( list1->val > list2->val){
point = list2;
list2 = list2->next;
}else{
point = list1;
list1 = list1->next;
}
ListNode* Head =point;//保存返回值
while(list1 && list2){
if( list1->val > list2->val){
point->next = list2;
list2 = list2->next;
point = point->next;
}else{
point->next = list1;
list1 = list1->next;
point = point->next;
}
}
if(list1!= nullptr){point->next = list1;}
if(list2!= nullptr){point->next = list2;}
return Head;
}
};
执行用时:
136 ms, 在所有 C++ 提交中击败了23.61%的用户
内存消耗:
12.6 MB, 在所有 C++ 提交中击败了96.14%的用户
通过测试用例:
133 / 133
参考与更多
- 还有使用 归并排序 解题的:
/*
c++简洁的归并排序做法
*/
class Solution {
public:
void mergeSort(vector<ListNode*>& lists, int left, int right)
{
if(left == right) return;
//递归归并排序
int mid = left + (right - left) / 2;
mergeSort(lists, left, mid);
mergeSort(lists, mid+1, right);
//合并l位置与mid+1位置的链表
ListNode *l1 = lists[left], *l2 = lists[mid+1];
ListNode *dummy = new ListNode();
ListNode *r = dummy;
while(l1 && l2)
{
if(l1->val < l2->val)
{
ListNode *t = l1->next;
l1->next = r->next;
r->next = l1;
l1 = t;
}
else
{
ListNode *t = l2->next;
l2->next = r->next;
r->next = l2;
l2 = t;
}
r = r->next;
}
if(l1) r->next = l1;
else r->next = l2;
lists[left] = dummy->next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size() == 0) return nullptr;
mergeSort(lists, 0, lists.size()-1);
return lists[0];
}
};