#include <bits/stdc++.h>
using namespace std;
struct Node{
int val;
Node *next;
};
class List{
public:
Node *head, *tail;
List(){
head = tail = NULL;
}
Node *getNode(int &data){
Node *nn = new Node;
nn->val = data;
nn->next = NULL;
return nn;
}
void insertNode(int &data){
if(!head){
head = tail = getNode(data);
return;
}
tail->next = getNode(data);
tail = tail->next;
}
void mergeSort() {
head = mergeSortHelper(head);
}
Node *mergeSortHelper(Node *start){
if(start && start->next){
Node *mid = divideList(start);
Node *first = mergeSortHelper(start);
Node *second = mergeSortHelper(mid);
return mergeListsRecur(NULL, first, NULL, second);
}
else{
return start;
}
}
/*========================== Iterative Merge =============================*/
Node *mergeListsIter(Node* head1, Node* head2) {
if(!head1)
return head2;
if(!head2)
return head1;
Node *c1 = head1, *c2 = head2, *p1=NULL, *p2=NULL;
while(c1 && c2){
if(c1->val > c2->val){
if(!p1 && !p2){
p2 = c2;
c2 = c2->next;
p2->next = c1;
p1 = p2;
p2 = NULL;
head1 = p1;
}
else if(!p2){
p2 = c2;
c2 = c2->next;
p2->next = c1;
p1->next = p2;
p1 = p2;
p2 = NULL;
}
}
else{
p1 = c1;
c1 = c1->next;
}
}
if(!c1 && c2){
p1->next = c2;
c2 = NULL;
}
return head1;
}
/*========================== Iterative Merge =============================*/
/*========================== Recursive Merge =============================*/
Node *mergeListsRecur(Node *p1, Node *h1, Node* p2, Node *h2){
if(!p1 && !h1)
return h2;
if(!p2 && !h2)
return h1;
if(p1 && !h1){
p1->next = h2;
return NULL;
}
if(p2 && !h2){
return NULL;
}
Node *start = NULL;
if(h1->val > h2->val){
Node *nxt = h2->next;
h2->next = h1;
if(!p1 && !p2){
start = h2;
}
else if(!p2){
p1->next = h2;
}
mergeListsRecur(h2, h1, p2, nxt);
}
else{
mergeListsRecur(h1, h1->next, p2, h2);
}
return start ? start : h1;
}
/*========================== Recursive Merge =============================*/
Node *divideList(Node *ptr){
Node *prev = NULL, *slow = ptr, *fast = ptr;
while(fast && fast->next){
prev = slow;
slow = slow->next;
fast = fast->next->next;
}
if(prev)
prev->next = NULL;
return slow;
}
void printList(){
Node *curr = head;
while(curr){
cout<<curr->val;
curr = curr->next;
if(curr)
cout<<"->";
}
}
};
int main() {
int n;
cin>>n;
int data;
List lst;
for(int i = 0; i < n; ++i){
cin>>data;
lst.insertNode(data);
}
lst.mergeSort();
lst.printList();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTm9kZXsKICBpbnQgdmFsOwogIE5vZGUgKm5leHQ7Cn07CgpjbGFzcyBMaXN0ewogICAgcHVibGljOgogICAgTm9kZSAqaGVhZCwgKnRhaWw7CiAgICAKICAgIExpc3QoKXsKICAgICAgICBoZWFkID0gdGFpbCA9IE5VTEw7CiAgICB9CiAgICAKICAgIE5vZGUgKmdldE5vZGUoaW50ICZkYXRhKXsKICAgICAgICBOb2RlICpubiA9IG5ldyBOb2RlOwogICAgICAgIG5uLT52YWwgPSBkYXRhOwogICAgICAgIG5uLT5uZXh0ID0gTlVMTDsKICAgICAgICByZXR1cm4gbm47CiAgICB9CiAgICAKICAgIHZvaWQgaW5zZXJ0Tm9kZShpbnQgJmRhdGEpewogICAgICAgIGlmKCFoZWFkKXsKICAgICAgICAgICAgaGVhZCA9IHRhaWwgPSBnZXROb2RlKGRhdGEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRhaWwtPm5leHQgPSBnZXROb2RlKGRhdGEpOwogICAgICAgIHRhaWwgPSB0YWlsLT5uZXh0OwogICAgfQogICAgCiAgICB2b2lkIG1lcmdlU29ydCgpIHsKICAgICAgICBoZWFkID0gbWVyZ2VTb3J0SGVscGVyKGhlYWQpOwogICAgfQogICAgCiAgICBOb2RlICptZXJnZVNvcnRIZWxwZXIoTm9kZSAqc3RhcnQpewogICAgICAgIGlmKHN0YXJ0ICYmIHN0YXJ0LT5uZXh0KXsKICAgICAgICAgICAgCiAgICAgICAgICAgIE5vZGUgKm1pZCA9IGRpdmlkZUxpc3Qoc3RhcnQpOwogICAgICAgICAgICAKICAgICAgICAgICAgTm9kZSAqZmlyc3QgPSBtZXJnZVNvcnRIZWxwZXIoc3RhcnQpOwogICAgICAgICAgICBOb2RlICpzZWNvbmQgPSBtZXJnZVNvcnRIZWxwZXIobWlkKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiBtZXJnZUxpc3RzUmVjdXIoTlVMTCwgZmlyc3QsIE5VTEwsIHNlY29uZCk7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIHJldHVybiBzdGFydDsKICAgICAgICB9CiAgICB9Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlcmF0aXZlIE1lcmdlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8gIAogICAgTm9kZSAqbWVyZ2VMaXN0c0l0ZXIoTm9kZSogaGVhZDEsIE5vZGUqIGhlYWQyKSB7CiAgICAgICAgCiAgICAgICAgaWYoIWhlYWQxKQogICAgICAgICAgICByZXR1cm4gaGVhZDI7CiAgICAgICAgCiAgICAgICAgaWYoIWhlYWQyKQogICAgICAgICAgICByZXR1cm4gaGVhZDE7CiAgICAgICAgCiAgICAgICAgTm9kZSAqYzEgPSBoZWFkMSwgKmMyID0gaGVhZDIsICpwMT1OVUxMLCAqcDI9TlVMTDsKCiAgICAgICAgd2hpbGUoYzEgJiYgYzIpewogICAgICAgICAgICBpZihjMS0+dmFsID4gYzItPnZhbCl7CgogICAgICAgICAgICAgICAgaWYoIXAxICYmICFwMil7CiAgICAgICAgICAgICAgICAgICAgcDIgPSBjMjsKICAgICAgICAgICAgICAgICAgICBjMiA9IGMyLT5uZXh0OwoKICAgICAgICAgICAgICAgICAgICBwMi0+bmV4dCA9IGMxOwogICAgICAgICAgICAgICAgICAgIHAxID0gcDI7CiAgICAgICAgICAgICAgICAgICAgcDIgPSBOVUxMOwoKICAgICAgICAgICAgICAgICAgICBoZWFkMSA9IHAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZighcDIpewogICAgICAgICAgICAgICAgICAgIHAyID0gYzI7CiAgICAgICAgICAgICAgICAgICAgYzIgPSBjMi0+bmV4dDsKCiAgICAgICAgICAgICAgICAgICAgcDItPm5leHQgPSBjMTsKICAgICAgICAgICAgICAgICAgICBwMS0+bmV4dCA9IHAyOwogICAgICAgICAgICAgICAgICAgIHAxID0gcDI7CiAgICAgICAgICAgICAgICAgICAgcDIgPSBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBwMSA9IGMxOwogICAgICAgICAgICAgICAgYzEgPSBjMS0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYoIWMxICYmIGMyKXsKICAgICAgICAgICAgcDEtPm5leHQgPSBjMjsKICAgICAgICAgICAgYzIgPSBOVUxMOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGhlYWQxOwogICAgfQovKj09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZXJhdGl2ZSBNZXJnZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovICAKICAgIAovKj09PT09PT09PT09PT09PT09PT09PT09PT09IFJlY3Vyc2l2ZSBNZXJnZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovICAKICAgIE5vZGUgKm1lcmdlTGlzdHNSZWN1cihOb2RlICpwMSwgTm9kZSAqaDEsIE5vZGUqIHAyLCBOb2RlICpoMil7CiAgICAgICAgCiAgICAgICAgaWYoIXAxICYmICFoMSkKICAgICAgICAgICAgcmV0dXJuIGgyOwogICAgICAgIAogICAgICAgIGlmKCFwMiAmJiAhaDIpCiAgICAgICAgICAgIHJldHVybiBoMTsKICAgICAgICAKICAgICAgICBpZihwMSAmJiAhaDEpewogICAgICAgICAgICBwMS0+bmV4dCA9IGgyOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYocDIgJiYgIWgyKXsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIE5vZGUgKnN0YXJ0ID0gTlVMTDsKICAgICAgICAKICAgICAgICBpZihoMS0+dmFsID4gaDItPnZhbCl7CiAgICAgICAgICAgIE5vZGUgKm54dCA9IGgyLT5uZXh0OwogICAgICAgICAgICBoMi0+bmV4dCA9IGgxOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYoIXAxICYmICFwMil7CiAgICAgICAgICAgICAgICBzdGFydCA9IGgyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYoIXAyKXsKICAgICAgICAgICAgICAgIHAxLT5uZXh0ID0gaDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIG1lcmdlTGlzdHNSZWN1cihoMiwgaDEsIHAyLCBueHQpOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBtZXJnZUxpc3RzUmVjdXIoaDEsIGgxLT5uZXh0LCBwMiwgaDIpOyAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHN0YXJ0ID8gc3RhcnQgOiBoMTsKICAgIH0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWN1cnNpdmUgTWVyZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLyAgCgogICAgTm9kZSAqZGl2aWRlTGlzdChOb2RlICpwdHIpewogICAgICAgIE5vZGUgKnByZXYgPSBOVUxMLCAqc2xvdyA9IHB0ciwgKmZhc3QgPSBwdHI7CiAgICAgICAgCiAgICAgICAgd2hpbGUoZmFzdCAmJiBmYXN0LT5uZXh0KXsKICAgICAgICAgICAgcHJldiA9IHNsb3c7CiAgICAgICAgICAgIHNsb3cgPSBzbG93LT5uZXh0OwogICAgICAgICAgICBmYXN0ID0gZmFzdC0+bmV4dC0+bmV4dDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYocHJldikKICAgICAgICAgICAgcHJldi0+bmV4dCA9IE5VTEw7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNsb3c7CiAgICB9CiAgICAgICAgCiAgICB2b2lkIHByaW50TGlzdCgpewogICAgICAgIE5vZGUgKmN1cnIgPSBoZWFkOwogICAgICAgIAogICAgICAgIHdoaWxlKGN1cnIpewogICAgICAgICAgICBjb3V0PDxjdXJyLT52YWw7CiAgICAgICAgICAgIGN1cnIgPSBjdXJyLT5uZXh0OwogICAgICAgICAgICAKICAgICAgICAgICAgaWYoY3VycikKICAgICAgICAgICAgCWNvdXQ8PCItPiI7CiAgICAgICAgfQogICAgfQp9OwoKaW50IG1haW4oKSB7CiAgICBpbnQgbjsKICAgIGNpbj4+bjsKICAgIAogICAgaW50IGRhdGE7CiAgICAKICAgIExpc3QgbHN0OwogICAgICAgIAogICAgZm9yKGludCBpID0gMDsgaSA8IG47ICsraSl7CiAgICAgICAgY2luPj5kYXRhOwogICAgICAgIGxzdC5pbnNlcnROb2RlKGRhdGEpOwogICAgfQogICAgCiAgICBsc3QubWVyZ2VTb3J0KCk7CiAgICAKICAgIGxzdC5wcmludExpc3QoKTsKICAgIAogICAgcmV0dXJuIDA7Cn0=