#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
struct node
{
int value;
node *next;
};
struct Linked
{
node *Head;
int count1;
};
void Insert_Function(Linked *Obj,int ele)
{
node *temp=(node *)malloc(sizeof(node));
temp->value=ele;
temp->next=Obj->Head;
Obj->Head=temp;
Obj->count1++;
}
void Display(Linked *Obj)
{
node *temp=Obj->Head;
if(temp==NULL)
{
printf("\n Linked list is empty");
return;
}
while(temp!=NULL)
{
printf("%d ",temp->value);
temp=temp->next;
}
}
void Reverse(Linked *Obj)
{
node *prev=NULL,*mid=NULL,*first=Obj->Head;
while(first!=NULL)
{
mid=first;
first=first->next;
mid->next=prev;
prev=mid;
}
Obj->Head=mid;
}
node *Mid_Find(node *temp)
{
node *slow,*fast;
slow=temp;
if(slow==NULL)
return(slow);
fast=slow->next;
if(fast==NULL)
return(slow);
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
return(slow);
}
node *Merge_Lists(node *first,node *second)
{
int val1,val2;
Linked *result=(Linked *)malloc(sizeof(Linked));
result->Head=NULL;
result->count1=0;
while(first!=NULL||second!=NULL)
{
if(first!=NULL)
val1=first->value;
else
val1=INT_MAX;
if(second!=NULL)
val2=second->value;
else
val2=INT_MAX;
if(val1<val2)
{
Insert_Function(result,val1);
if(first!=NULL)
first=first->next;
}
else
{
Insert_Function(result,val2);
if(second!=NULL)
second=second->next;
}
}
Reverse(result);
return(result->Head);
}
node * Merge_Sort(node *temp)
{
node *first,*second,*mid,*result=NULL;
if(temp->next==NULL)
return(temp);
mid=Mid_Find(temp);
first=temp;
if(mid!=NULL)
second=mid->next;
mid->next=NULL;
first=Merge_Sort(first);
second=Merge_Sort(second);
result=Merge_Lists(first,second);
return(result);
}
int main()
{
Linked *Obj=(Linked *)malloc(sizeof(Linked));
bool check;
Obj->Head=NULL;
Obj->count1=0;
Insert_Function(Obj,10);
Insert_Function(Obj,5);
Insert_Function(Obj,1);
Insert_Function(Obj,7);
Insert_Function(Obj,4);
Insert_Function(Obj,2);
Insert_Function(Obj,3);
Insert_Function(Obj,9);
Insert_Function(Obj,8);
Insert_Function(Obj,6);
printf("\n Linked List : " );
Display(Obj);
Obj->Head=Merge_Sort(Obj->Head);
printf("\n Sorted Linked List is : ");
Display(Obj);
return(0);
}
CgogICAgICAjaW5jbHVkZTxzdGRpby5oPgogICAgICAjaW5jbHVkZTxzdGRsaWIuaD4KICAgICAgI2luY2x1ZGU8bGltaXRzLmg+CgogICAgICBzdHJ1Y3Qgbm9kZQogICAgICB7CiAgICAgICAgIGludCB2YWx1ZTsKICAgICAgICAgbm9kZSAqbmV4dDsKICAgICAgfTsKCiAgICAgIHN0cnVjdCBMaW5rZWQKICAgICAgewogICAgICAgIG5vZGUgKkhlYWQ7CiAgICAgICAgaW50IGNvdW50MTsKICAgICAgfTsKCiAgICAgICAgdm9pZCBJbnNlcnRfRnVuY3Rpb24oTGlua2VkICpPYmosaW50IGVsZSkKICAgICAgICB7CiAgICAgICAgICAgbm9kZSAqdGVtcD0obm9kZSAqKW1hbGxvYyhzaXplb2Yobm9kZSkpOwogICAgICAgICAgIHRlbXAtPnZhbHVlPWVsZTsKICAgICAgICAgICB0ZW1wLT5uZXh0PU9iai0+SGVhZDsKICAgICAgICAgICBPYmotPkhlYWQ9dGVtcDsKICAgICAgICAgICBPYmotPmNvdW50MSsrOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBEaXNwbGF5KExpbmtlZCAqT2JqKQogICAgICAgIHsKICAgICAgICAgICBub2RlICp0ZW1wPU9iai0+SGVhZDsKICAgICAgICAgICBpZih0ZW1wPT1OVUxMKQogICAgICAgICAgIHsKICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBMaW5rZWQgbGlzdCBpcyBlbXB0eSIpOwogICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgfQogICAgICAgICAgIHdoaWxlKHRlbXAhPU5VTEwpCiAgICAgICAgICAgewogICAgICAgICAgICAgIHByaW50ZigiJWQgIix0ZW1wLT52YWx1ZSk7CiAgICAgICAgICAgICAgdGVtcD10ZW1wLT5uZXh0OwogICAgICAgICAgIH0KICAgICAgICB9CgoKICAgICB2b2lkIFJldmVyc2UoTGlua2VkICpPYmopCiAgICAgewogICAgICAgIG5vZGUgKnByZXY9TlVMTCwqbWlkPU5VTEwsKmZpcnN0PU9iai0+SGVhZDsKICAgICAgICB3aGlsZShmaXJzdCE9TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgbWlkPWZpcnN0OwogICAgICAgICAgIGZpcnN0PWZpcnN0LT5uZXh0OwogICAgICAgICAgIG1pZC0+bmV4dD1wcmV2OwogICAgICAgICAgIHByZXY9bWlkOwogICAgICAgIH0KICAgICAgICBPYmotPkhlYWQ9bWlkOwogICAgIH0KCgoKICAgICBub2RlICpNaWRfRmluZChub2RlICp0ZW1wKQogICAgIHsKICAgICAgICBub2RlICpzbG93LCpmYXN0OwogICAgICAgIHNsb3c9dGVtcDsKICAgICAgICBpZihzbG93PT1OVUxMKQogICAgICAgICAgICByZXR1cm4oc2xvdyk7CiAgICAgICAgZmFzdD1zbG93LT5uZXh0OwogICAgICAgIGlmKGZhc3Q9PU5VTEwpCiAgICAgICAgICAgIHJldHVybihzbG93KTsKICAgICAgICB3aGlsZShmYXN0JiZmYXN0LT5uZXh0KQogICAgICAgIHsKICAgICAgICAgICAgc2xvdz1zbG93LT5uZXh0OwogICAgICAgICAgICBmYXN0PWZhc3QtPm5leHQtPm5leHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybihzbG93KTsKICAgICB9CgoKICAgICBub2RlICpNZXJnZV9MaXN0cyhub2RlICpmaXJzdCxub2RlICpzZWNvbmQpCiAgICAgewogICAgICAgaW50IHZhbDEsdmFsMjsKICAgICAgIExpbmtlZCAqcmVzdWx0PShMaW5rZWQgKiltYWxsb2Moc2l6ZW9mKExpbmtlZCkpOwogICAgICAgcmVzdWx0LT5IZWFkPU5VTEw7CiAgICAgICByZXN1bHQtPmNvdW50MT0wOwogICAgICAgd2hpbGUoZmlyc3QhPU5VTEx8fHNlY29uZCE9TlVMTCkKICAgICAgIHsKICAgICAgICAgaWYoZmlyc3QhPU5VTEwpCiAgICAgICAgICAgIHZhbDE9Zmlyc3QtPnZhbHVlOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICB2YWwxPUlOVF9NQVg7CiAgICAgICAgIGlmKHNlY29uZCE9TlVMTCkKICAgICAgICAgICAgIHZhbDI9c2Vjb25kLT52YWx1ZTsKICAgICAgICAgZWxzZQogICAgICAgICAgICB2YWwyPUlOVF9NQVg7CiAgICAgICAgIGlmKHZhbDE8dmFsMikKICAgICAgICAgewogICAgICAgICAgICAgICAgSW5zZXJ0X0Z1bmN0aW9uKHJlc3VsdCx2YWwxKTsKICAgICAgICAgICAgICAgIGlmKGZpcnN0IT1OVUxMKQogICAgICAgICAgICAgICAgICAgIGZpcnN0PWZpcnN0LT5uZXh0OwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgICAgSW5zZXJ0X0Z1bmN0aW9uKHJlc3VsdCx2YWwyKTsKICAgICAgICAgICAgICAgIGlmKHNlY29uZCE9TlVMTCkKICAgICAgICAgICAgICAgICAgICBzZWNvbmQ9c2Vjb25kLT5uZXh0OwogICAgICAgICB9CiAgICAgICB9CiAgICAgIFJldmVyc2UocmVzdWx0KTsKICAgICAgcmV0dXJuKHJlc3VsdC0+SGVhZCk7CiAgICAgfQoKCiAgICAgbm9kZSAqIE1lcmdlX1NvcnQobm9kZSAqdGVtcCkKICAgICB7CiAgICAgICAgbm9kZSAqZmlyc3QsKnNlY29uZCwqbWlkLCpyZXN1bHQ9TlVMTDsKCiAgICAgICAgaWYodGVtcC0+bmV4dD09TlVMTCkKICAgICAgICAgICAgcmV0dXJuKHRlbXApOwogICAgICAgIG1pZD1NaWRfRmluZCh0ZW1wKTsKCiAgICAgICAgZmlyc3Q9dGVtcDsKICAgICAgICBpZihtaWQhPU5VTEwpCiAgICAgICAgICBzZWNvbmQ9bWlkLT5uZXh0OwogICAgICAgIG1pZC0+bmV4dD1OVUxMOwogICAgICAgIGZpcnN0PU1lcmdlX1NvcnQoZmlyc3QpOwogICAgICAgIHNlY29uZD1NZXJnZV9Tb3J0KHNlY29uZCk7CiAgICAgICAgcmVzdWx0PU1lcmdlX0xpc3RzKGZpcnN0LHNlY29uZCk7CiAgICAgICAgcmV0dXJuKHJlc3VsdCk7CiAgICAgfQoKCiAgICAgIGludCBtYWluKCkKICAgICAgewoKICAgICAgICBMaW5rZWQgKk9iaj0oTGlua2VkICopbWFsbG9jKHNpemVvZihMaW5rZWQpKTsKICAgICAgICBib29sIGNoZWNrOwogICAgICAgIE9iai0+SGVhZD1OVUxMOwogICAgICAgIE9iai0+Y291bnQxPTA7CiAgICAgICAgSW5zZXJ0X0Z1bmN0aW9uKE9iaiwxMCk7CiAgICAgICAgSW5zZXJ0X0Z1bmN0aW9uKE9iaiw1KTsKICAgICAgICBJbnNlcnRfRnVuY3Rpb24oT2JqLDEpOwogICAgICAgIEluc2VydF9GdW5jdGlvbihPYmosNyk7CiAgICAgICAgSW5zZXJ0X0Z1bmN0aW9uKE9iaiw0KTsKICAgICAgICBJbnNlcnRfRnVuY3Rpb24oT2JqLDIpOwogICAgICAgIEluc2VydF9GdW5jdGlvbihPYmosMyk7CiAgICAgICAgSW5zZXJ0X0Z1bmN0aW9uKE9iaiw5KTsKICAgICAgICBJbnNlcnRfRnVuY3Rpb24oT2JqLDgpOwogICAgICAgIEluc2VydF9GdW5jdGlvbihPYmosNik7CiAgICAgICAgcHJpbnRmKCJcbiBMaW5rZWQgTGlzdCA6ICIgKTsKICAgICAgICBEaXNwbGF5KE9iaik7CiAgICAgICAgT2JqLT5IZWFkPU1lcmdlX1NvcnQoT2JqLT5IZWFkKTsKICAgICAgICBwcmludGYoIlxuIFNvcnRlZCBMaW5rZWQgTGlzdCBpcyA6ICIpOwogICAgICAgIERpc3BsYXkoT2JqKTsKICAgICAgICByZXR1cm4oMCk7CiAgICAgIH0K