合并k个有序链表
#include <iostream>
#include <vector>
#include <stdlib.h>
#include<algorithm>
using namespace std;
class ListNode {
public:
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) {}
bool operator > (const ListNode b){
//cout << "operator > called ";
return this->val > b.val;
}
bool operator < (const ListNode b){
//cout << "operator < called ";
return this->val < b.val;
}
};
void swap1(ListNode*& i, ListNode* &j)
{
ListNode* tmp = i;
i = j;
j = tmp;
cout << "swap listnode" << endl;
}
void quickSort1(vector<ListNode*> &q, int l, int r){
//cout << "quicksort1 " << l << " " << r << endl;
if(l >= r)
return;
int i = l-1 , j = r+1 ;
ListNode* x = q[l + rand() % (r - l + 1)];
while(i < j){
do j--; while(*q[j] > *x);
do i++; while(*q[i] < *x);
if(i < j){
swap1(q[i], q[j]);
}
else{
quickSort1(q, l, j); // 这里必须是j,而不能是i;
quickSort1(q, j + 1, r);
}
}
if(i!=j && q[i] != q[j])
cout << x << ' ' << q[j] << ' ' << q[i] << endl;
}
class Solution {
public:
bool comp(ListNode* a, ListNode* b){
return a->val < b->val;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
int k = lists.size();
if(k>10000){
cout << "list too large." << endl;
return nullptr;
}
for(auto x: lists)
cout << x->val << " ";
cout << endl;
//sort(lists.begin(),lists.end(), comp);
quickSort1(lists, 0, k-1);
for(auto x: lists)
cout << x->val << " ";
cout << endl;
ListNode* ret = nullptr;
ListNode* tmp, *end;
ret = lists[0];
tmp = ret;
end = nullptr;
while(lists.size()>0){
tmp = lists[0];
if(end == nullptr)
end = tmp;
else{
end->next = tmp;
end = tmp;
}
if(tmp->next == nullptr){
lists.erase(lists.begin());
if(lists.size()==0)
break;
continue;
}
else{
tmp = lists[0]->next;
lists[0] = tmp;
for(int i = 1; i < lists.size() && *tmp > *lists[i]; i++)
swap(lists[i-1], lists[i]);
}
}
end->next = nullptr;
cout << endl;
end = ret;
while(end!=nullptr){
cout << end->val << " ";
end = end->next;
}
return ret;
}
};
// test
int main(){
int n = 5;
vector < ListNode * > q;
//cin >> n;
for(int i = 0; i < n; i++){
ListNode* tmp = nullptr;
ListNode* tt = tmp;
//cin >> t;
int count = rand()%10+1;
cout << count << endl;
for(int j= 0; j< count; j++){
int t = rand()%20000 - 10000;
ListNode* ins = new ListNode(t);
tt = tmp;
while(tt!= nullptr && tt->val < t && tt->next!= nullptr&&tt->next->val <t)
tt = tt->next;
if(tt == nullptr){
tmp = ins;
}
else if(tt->val < t)
{
ins->next = tt->next;
tt->next = ins;
}
else{
ins->next = tt;
tmp = ins;
}
}
tt = tmp;
while(tt!=nullptr){
cout << tt->val << " ";
tt = tt->next;
}
cout << endl;
q.push_back(tmp);
}
cout << "start merge " << q.size() << endl;
Solution test;
test.mergeKLists(q);
//for(auto x : q)
// cout << x << ' ';
//cout << q.size() << ' ';
return 0;
}