#include <stdio.h>
typedef struct node {
int val;
struct node* next;
}node;
struct node* create_node(int val) {
struct node
* new_node
= (struct node
*)malloc(sizeof(struct node
)); new_node->val = val;
new_node->next = NULL;
return new_node;
}
void insert_tail(struct node** head_ref, int val) {
struct node* new_node = create_node(val);
if (*head_ref == NULL) {
*head_ref = new_node;
return;
}
struct node* temp = *head_ref;
while (temp->next)
temp = temp->next;
temp->next = new_node;
}
node *find_mid(node *head){
if(!head) return head;
node *slow,*fast;
fast = slow = head;
node *prev=NULL;
while(fast && fast->next){
prev=slow;
fast=fast->next->next;
slow=slow->next;
}
if(prev) prev->next=NULL;
return slow;
}
node *merge_sorted(node *n1,node *n2){
if(!n1) return n2;
if(!n2) return n1;
node *head = NULL;
if(n1->val<n2->val){
head=n1;
head->next=merge_sorted(n1->next,n2);}
else {
head = n2;
head->next = merge_sorted(n1,n2->next);
}
return head;}
node* Merge_sort(node *head){
if(!head || !head->next) return head;
node *mid = find_mid(head);
node *left = Merge_sort(head);
node *right = Merge_sort(mid);
head = merge_sorted(left,right);
return head;
}
int main() {
node *head=NULL;
for(int i=5;i>=0;--i) insert_tail(&head,i);
head = Merge_sort(head);
node *temp=head;
while(temp){
temp=temp->next;
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHN0cnVjdCBub2RlIHsKICAgIGludCB2YWw7CiAgICBzdHJ1Y3Qgbm9kZSogbmV4dDsKICAgICAgICAgICAgICAgfW5vZGU7CgpzdHJ1Y3Qgbm9kZSogY3JlYXRlX25vZGUoaW50IHZhbCkgewogICAgc3RydWN0IG5vZGUqIG5ld19ub2RlID0gKHN0cnVjdCBub2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBub2RlKSk7CiAgICBuZXdfbm9kZS0+dmFsID0gdmFsOwogICAgbmV3X25vZGUtPm5leHQgPSBOVUxMOwogICAgcmV0dXJuIG5ld19ub2RlOwp9CgogICB2b2lkIGluc2VydF90YWlsKHN0cnVjdCBub2RlKiogaGVhZF9yZWYsIGludCB2YWwpIHsKICAgIHN0cnVjdCBub2RlKiBuZXdfbm9kZSA9IGNyZWF0ZV9ub2RlKHZhbCk7CiAgICBpZiAoKmhlYWRfcmVmID09IE5VTEwpIHsKICAgICAgICAqaGVhZF9yZWYgPSBuZXdfbm9kZTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBzdHJ1Y3Qgbm9kZSogdGVtcCA9ICpoZWFkX3JlZjsKICAgIHdoaWxlICh0ZW1wLT5uZXh0KQogICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OwogICAgdGVtcC0+bmV4dCA9IG5ld19ub2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgIG5vZGUgKmZpbmRfbWlkKG5vZGUgKmhlYWQpewogICAgICBpZighaGVhZCkgcmV0dXJuIGhlYWQ7CiAgICAgIG5vZGUgKnNsb3csKmZhc3Q7CiAgICAgIGZhc3QgPSBzbG93ID0gaGVhZDsKICAgICAgbm9kZSAqcHJldj1OVUxMOwogICAgICB3aGlsZShmYXN0ICYmIGZhc3QtPm5leHQpewogICAgICAgICBwcmV2PXNsb3c7CiAgICAgICAgIGZhc3Q9ZmFzdC0+bmV4dC0+bmV4dDsKICAgICAgICAgc2xvdz1zbG93LT5uZXh0OwogICAgICB9CiAgICAgIGlmKHByZXYpIHByZXYtPm5leHQ9TlVMTDsKICAgICAgcmV0dXJuIHNsb3c7ICAgCiAgICAgfSAKCiAgICAgbm9kZSAqbWVyZ2Vfc29ydGVkKG5vZGUgKm4xLG5vZGUgKm4yKXsKICAgICAgaWYoIW4xKSByZXR1cm4gbjI7CiAgICAgIGlmKCFuMikgcmV0dXJuIG4xOwogICAgICBub2RlICpoZWFkID0gTlVMTDsKICAgICAgaWYobjEtPnZhbDxuMi0+dmFsKXsKICAgICAgICAgaGVhZD1uMTsKICAgICAgICAgaGVhZC0+bmV4dD1tZXJnZV9zb3J0ZWQobjEtPm5leHQsbjIpO30KICAgICAgZWxzZSB7CiAgICAgICAgIGhlYWQgPSBuMjsKICAgICAgICAgaGVhZC0+bmV4dCA9IG1lcmdlX3NvcnRlZChuMSxuMi0+bmV4dCk7CiAgICAgfQogICAgIHJldHVybiBoZWFkO30KCiAgICAgbm9kZSogTWVyZ2Vfc29ydChub2RlICpoZWFkKXsKICAgICAgaWYoIWhlYWQgfHwgIWhlYWQtPm5leHQpIHJldHVybiBoZWFkOwogICAgICBub2RlICptaWQgPSBmaW5kX21pZChoZWFkKTsKICAgICAgbm9kZSAqbGVmdCA9IE1lcmdlX3NvcnQoaGVhZCk7CiAgICAgIG5vZGUgKnJpZ2h0ID0gTWVyZ2Vfc29ydChtaWQpOwogICAgICBoZWFkID0gbWVyZ2Vfc29ydGVkKGxlZnQscmlnaHQpOwogICAgICByZXR1cm4gaGVhZDsKICAgICB9CgogICAgaW50IG1haW4oKSB7CiAgICAgIG5vZGUgKmhlYWQ9TlVMTDsKICAgICAgZm9yKGludCBpPTU7aT49MDstLWkpIGluc2VydF90YWlsKCZoZWFkLGkpOwogICAgICBoZWFkID0gTWVyZ2Vfc29ydChoZWFkKTsKICAgICAgbm9kZSAqdGVtcD1oZWFkOwogICAgICB3aGlsZSh0ZW1wKXsKICAgICAgICAgcHJpbnRmKCIlZCAiLHRlbXAtPnZhbCk7CiAgICAgICAgIHRlbXA9dGVtcC0+bmV4dDsKICAgICAgfQogICAgcmV0dXJuIDA7Cn0K