#include<iostream>
using namespace std;
class node{
public:
int data;
node *next;
node(int d){
data = d;
next = NULL;
}
};
void insertAtTail(node *&head, int data){
if(head==NULL){
head= new node(data);
return;
}
node *tail = head;
while(tail->next!=NULL){
tail=tail->next;
}
tail->next=new node(data);
return;
}
void buildInput(node *&head){
int data;
cin>>data;
while(data!=-1){
insertAtTail(head,data);
cin>>data;
}
}
//racer technique
node *midPoint(node *head){
if(head==NULL || head->next==NULL){
return head;
}
node *slow =head;
node *fast = head->next;
while (fast!=NULL && fast->next!=NULL){
fast=fast->next->next;
slow=slow->next;
}
return slow;
}
node *Merge(node *a, node *b){
//base case
if(a==NULL){
return b;
}
else if (b==NULL){
return a;
}
//compare a and b
node *c;
if(a->data < b->data){
c=a;
c->next = Merge(a->next,b);
}
else{
c=b;
c->next = Merge(a,b->next);
}
return c;
}
node *mergeSort(node *head){
//base case
if(head==NULL || head->next==NULL){
return head;
}
//rec case
//1.divide
node *mid = midPoint(head);
node *a = head;
node *b = mid->next;
mid->next = NULL;
//2.recursive sort
a = mergeSort(a);
b = mergeSort(b);
//3.merge a and b
node *c = Merge(a,b);
return c;
}
void print(node *head){
//node *temp=head;
while(head!=NULL){
cout<<head->data;
head=head->next;
}
}
int main(){
node *head=NULL;
buildInput(head);
/*node *m= midPoint(head);
cout<<m->data;*/
//print(head);
mergeSort(head);
print(head);
return 0;}
CiNpbmNsdWRlPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjbGFzcyBub2RlewpwdWJsaWM6CiAgICBpbnQgZGF0YTsKICAgIG5vZGUgKm5leHQ7CiAgICBub2RlKGludCBkKXsKICAgIGRhdGEgPSBkOwogICAgbmV4dCA9IE5VTEw7CiAgICB9Cn07Cgp2b2lkIGluc2VydEF0VGFpbChub2RlIComaGVhZCwgaW50IGRhdGEpewogICAgaWYoaGVhZD09TlVMTCl7CiAgICAgICAgaGVhZD0gbmV3IG5vZGUoZGF0YSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbm9kZSAqdGFpbCA9IGhlYWQ7CiAgICB3aGlsZSh0YWlsLT5uZXh0IT1OVUxMKXsKICAgICAgICB0YWlsPXRhaWwtPm5leHQ7CiAgICB9CiAgICB0YWlsLT5uZXh0PW5ldyBub2RlKGRhdGEpOwogICAgcmV0dXJuOwp9CnZvaWQgYnVpbGRJbnB1dChub2RlIComaGVhZCl7CiAgICBpbnQgZGF0YTsKICAgIGNpbj4+ZGF0YTsKICAgIHdoaWxlKGRhdGEhPS0xKXsKICAgICAgICBpbnNlcnRBdFRhaWwoaGVhZCxkYXRhKTsKICAgICAgICBjaW4+PmRhdGE7CiAgICB9Cn0KCi8vcmFjZXIgdGVjaG5pcXVlCm5vZGUgKm1pZFBvaW50KG5vZGUgKmhlYWQpewogICAgaWYoaGVhZD09TlVMTCB8fCBoZWFkLT5uZXh0PT1OVUxMKXsKICAgICAgICByZXR1cm4gaGVhZDsKICAgIH0KICAgIG5vZGUgKnNsb3cgPWhlYWQ7CiAgICBub2RlICpmYXN0ID0gaGVhZC0+bmV4dDsKICAgIHdoaWxlIChmYXN0IT1OVUxMICYmIGZhc3QtPm5leHQhPU5VTEwpewoKICAgICAgICBmYXN0PWZhc3QtPm5leHQtPm5leHQ7CiAgICAgICAgIHNsb3c9c2xvdy0+bmV4dDsKICAgIH0KICAgIHJldHVybiBzbG93Owp9Cgpub2RlICpNZXJnZShub2RlICphLCBub2RlICpiKXsKICAgIC8vYmFzZSBjYXNlCiAgICBpZihhPT1OVUxMKXsKICAgICAgICByZXR1cm4gYjsKICAgIH0KICAgIGVsc2UgaWYgKGI9PU5VTEwpewogICAgICAgIHJldHVybiBhOwogICAgfQogICAgLy9jb21wYXJlIGEgYW5kIGIKICAgIG5vZGUgKmM7CiAgICBpZihhLT5kYXRhIDwgYi0+ZGF0YSl7CiAgICAgICAgYz1hOwogICAgICAgIGMtPm5leHQgPSBNZXJnZShhLT5uZXh0LGIpOwogICAgfQogICAgZWxzZXsKICAgICAgICBjPWI7CiAgICAgICAgYy0+bmV4dCA9IE1lcmdlKGEsYi0+bmV4dCk7CiAgICB9CiAgICByZXR1cm4gYzsKCn0Kbm9kZSAqbWVyZ2VTb3J0KG5vZGUgKmhlYWQpewogICAgLy9iYXNlIGNhc2UKICAgIGlmKGhlYWQ9PU5VTEwgfHwgaGVhZC0+bmV4dD09TlVMTCl7CiAgICAgICAgcmV0dXJuIGhlYWQ7CiAgICB9CiAgICAvL3JlYyBjYXNlCiAgICAvLzEuZGl2aWRlCiAgICBub2RlICptaWQgPSBtaWRQb2ludChoZWFkKTsKICAgIG5vZGUgKmEgPSBoZWFkOwogICAgbm9kZSAqYiA9IG1pZC0+bmV4dDsKICAgIG1pZC0+bmV4dCA9IE5VTEw7CiAgICAvLzIucmVjdXJzaXZlIHNvcnQKICAgIGEgPSBtZXJnZVNvcnQoYSk7CiAgICBiID0gbWVyZ2VTb3J0KGIpOwogICAgLy8zLm1lcmdlICBhIGFuZCBiCiAgICBub2RlICpjID0gTWVyZ2UoYSxiKTsKICAgIHJldHVybiBjOwoKfQp2b2lkIHByaW50KG5vZGUgKmhlYWQpewogICAgLy9ub2RlICp0ZW1wPWhlYWQ7CiAgICB3aGlsZShoZWFkIT1OVUxMKXsKICAgICAgICBjb3V0PDxoZWFkLT5kYXRhOwogICAgICAgIGhlYWQ9aGVhZC0+bmV4dDsKICAgIH0KfQppbnQgbWFpbigpewogICAgbm9kZSAqaGVhZD1OVUxMOwogICAgYnVpbGRJbnB1dChoZWFkKTsKICAgIC8qbm9kZSAqbT0gbWlkUG9pbnQoaGVhZCk7CiAgICBjb3V0PDxtLT5kYXRhOyovCiAgICAvL3ByaW50KGhlYWQpOwogICAgbWVyZ2VTb3J0KGhlYWQpOwogICAgcHJpbnQoaGVhZCk7CnJldHVybiAwO30K