STL链表归并排序
stl链表归并思路
第一次见到这种思路来源于《stl源码剖析》一书。
#include <iostream>
#include<vector>
using namespace std;
struct Node {
int i;
Node* next;
Node(int ii):i(ii),next(nullptr) {
}
};
Node* merge(Node* l, Node* r) {
Node* ret = new Node(0);
Node* p = ret;
while (l && r) {
if (l->i > r->i) {
p->next = l;
l = l->next;
}
else {
p->next = r;
r = r->next;
}
p = p->next;
}
p->next = l == NULL ? r : l;
return ret->next;
}
Node* Nsort(Node* head) {
const int kMaxLength = 20;
vector<Node*> step(kMaxLength);
int E = 0;
while (head) {
step[0] = head;
head = head->next;
step[0]->next = NULL;
for (int i = 0; i < kMaxLength; i++) {
if (step[i+1] == NULL) {
step[i+1] = step[i];
step[i] = NULL;
E = E > i + 1 ? E : i + 1;
break;
}
else {
step[i+1] = merge(step[i], step[i + 1]);
step[i] = NULL;
}
}
}
for (int i = 0; i < E; i++) {
step[i + 1] = merge(step[i], step[i + 1]);
}
return step[E];
}
int main() {
int i;
vector<int> N;
Node* head = new Node(0);
Node* p = head;
while (cin >> i) {//window ctrl+z 结束控制台输入
p->next = new Node(i);
p = p->next;
}
head = Nsort(head->next);
while (head) {
cout << head->i << " ";
head = head->next;
}
return 0;
}