LeetCode——23. Merge k Sorted Lists(C++)
You are given an array of k linked-lists lists, each linked-list is sorted in ascending order.
Merge all the linked-lists into one sorted linked-list and return it.
Example 1:
Input: lists = [[1,4,5],[1,3,4],[2,6]]
Output: [1,1,2,3,4,4,5,6]
Explanation: The linked-lists are:
[
1->4->5,
1->3->4,
2->6
]
merging them into one sorted list:
1->1->2->3->4->4->5->6
Example 2:
Input: lists = []
Output: []
Example 3:
Input: lists = [[]]
Output: []
Constraints:
k == lists.length
0 <= k <= 104
0 <= lists[i].length <= 500
-104 <= lists[i][j] <= 104
lists[i] is sorted in ascending order.
The sum of lists[i].length will not exceed 104.
解题思路:
归并排序的归并;
代码:
/**
* 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 {
ListNode* help(ListNode* x,ListNode* y)
{
if(x==NULL)return y;
if(y==NULL)return x;
ListNode* head=new ListNode;
ListNode* nnext=head;
while(x!=NULL&&y!=NULL)
{
if(x->val<y->val)
{
nnext->next=x;
nnext=nnext->next;
x=x->next;
}
else
{
nnext->next=y;
nnext=nnext->next;
y=y->next;
}
}
if(x!=NULL)nnext->next=x;
if(y!=NULL)nnext->next=y;
return head->next;
}
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
int siz=lists.size();
if(siz==0)return NULL;
if(siz==1)return lists[0];
int i;
while(siz!=1)
{
vector<ListNode*>v;
for(i=0;i+1<siz;i+=2)v.push_back(help(lists[i],lists[i+1]));
if(i<siz)v.push_back(lists[i]);
lists.clear();
for(int i=0;i<v.size();i++)lists.push_back(v[i]);
siz=lists.size();
}
return lists[0];
}
};
submission: