合并K个有序链表,使用merge,谁小谁移动。
自己重新从头写一下加深印象。
C++:
#include<iostream>
#include<vector>
using namespace std;
class Node
{
public:
int value;
Node* next;
public:
Node(int val){
value = val;
next = NULL;
}
};
Node* merge(Node* head1,Node* head2)
{
if(head1 == NULL)
return head2;
if(head2 == NULL)
return head1;
//都不为空
Node* head = new Node(0);
Node* cur = head;
while((head1 != NULL) && (head2 != NULL))
{
//谁小谁移动
if(head1->value <= head2->value){
cur->next = head1;
head1 = head1->next;
}else{
cur->next = head2;
head2 = head2->next;
}
cur = cur->next;
}
if(head1 != NULL){
cur->next = head1;
}
else if(head2 != NULL){
cur->next = head2;
}
return head->next;
}
Node* dividemerge(vector<Node*> &v1,int left,int right)
{
//!!!
if(left > right)
return NULL;
//!!!
else if(left == right)
return v1[left];
int mid = left + ((right - left)>>1);
return merge(dividemerge(v1,left,mid),dividemerge(v1,mid + 1,right));
}
Node* kmerge(vector<Node*> &v1)
{
return dividemerge(v1,0,v1.size() - 1);
}
int main()
{
Node* node1 = new Node(1);
Node* node2 = new Node(2);
Node* node3 = new Node(3);
Node* node4 = new Node(4);
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = NULL;
Node* head1 = new Node(2);
Node* head2 = new Node(3);
Node* head3 = new Node(4);
Node* head4 = new Node(5);
head1->next = head2;
head2->next = head3;
head3->next = head4;
head4->next = NULL;
// while(node1 != NULL){
// cout<<node1->value<<"->";
// node1 = node1->next;
// }
// cout<<"NULL"<<endl;
vector<Node*> v1;
v1.push_back(node1);
v1.push_back(head1);
Node* head = kmerge(v1);
while(head != NULL){
cout<<head->value<<"->";
head = head->next;
}
cout<<"NULL"<<endl;
system("pause");
return 0;
}
结果: