import java.util.*;
import java.lang.*;
import java.io.*;
class Node
{
int data;
Node next;
Node(int data){
this.data = data;
next = null;
}
void append(Node head, int val){
Node temp = new Node(val);
Node cur = head;
if(head == null)
{
return;
}
while(cur.next != null)
{
cur = cur.next;
}
cur.next = temp;
return;
}
void display(){
Node cur = this;
while(cur != null)
{
System.
out.
print(cur.
data + "->"); cur = cur.next;
}
}
}
class Ideone
{
public Node findMiddle(Node head){
if(head == null )
return null;
Node slow, fast;
slow = head;
fast = head;
while(fast != null && fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public Node merge(Node first, Node second){
Node head = null;
while(first != null && second != null){
if(first.data < second.data){
if(head == null){
head = new Node(first.data);
}
else
head.append(head,first.data);
first = first.next;
}
else if(second.data < first.data){
if(head == null){
head = new Node(second.data);
}
else
head.append(head,second.data);
second = second.next;
}
else{
if(head == null){
head = new Node(first.data);
head.append(head,second.data);
}
else{
head.append(head,first.data);
head.append(head,second.data);
}
second = second.next;
first = first.next;
}
}
while(first != null){
if(head == null){
head = new Node(first.data);
}
else
head.append(head,first.data);
first = first.next;
}
while(first != null){
if(head == null){
head = new Node(first.data);
}
else
head.append(head,first.data);
first = first.next;
}
while(second != null){
if(head == null){
head = new Node(second.data);
}
else
head.append(head,second.data);
second = second.next;
}
return head;
}
public Node mergeSort(Node head){
if(head == null)
return null;
if(head.next == null)
return head;
Node first = head;
Node mid = findMiddle(first);
Node second = mid.next;
mid.next = null;
Node left = mergeSort(first);
Node right = mergeSort(second);
Node result = merge(left, right);
return result;
}
{
Node head = new Node(5);
head.append(head,1);
head.append(head,5);
head.append(head,1);
head.append(head,5);
head.append(head,3);
System.
out.
println("Unsoreted linked list:"); head.display();
Ideone tmp = new Ideone();
Node result = tmp.mergeSort(head);
System.
out.
println("\nSorted linked list:"); result.display();
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CiAKY2xhc3MgTm9kZQp7CglpbnQgZGF0YTsKCU5vZGUgbmV4dDsKIAoJTm9kZShpbnQgZGF0YSl7CgkJdGhpcy5kYXRhID0gZGF0YTsKCQluZXh0ID0gbnVsbDsKCX0KIAoJdm9pZCBhcHBlbmQoTm9kZSBoZWFkLCBpbnQgdmFsKXsKCQlOb2RlIHRlbXAgPSBuZXcgTm9kZSh2YWwpOwoJCU5vZGUgY3VyID0gaGVhZDsKIAoJCWlmKGhlYWQgPT0gbnVsbCkKCQl7CgkJCXJldHVybjsKCQl9CgkJd2hpbGUoY3VyLm5leHQgIT0gbnVsbCkKCQl7CgkJCWN1ciA9IGN1ci5uZXh0OwoJCX0KCQljdXIubmV4dCA9IHRlbXA7CgkJcmV0dXJuOwogCgl9CiAKCXZvaWQgZGlzcGxheSgpewogCgkJTm9kZSBjdXIgPSB0aGlzOwoJCXdoaWxlKGN1ciAhPSBudWxsKQoJCXsKCQkJU3lzdGVtLm91dC5wcmludChjdXIuZGF0YSArICItPiIpOwoJCQljdXIgPSBjdXIubmV4dDsKCQl9Cgl9Cn0KIApjbGFzcyBJZGVvbmUKewoJcHVibGljIE5vZGUgZmluZE1pZGRsZShOb2RlIGhlYWQpewoJCWlmKGhlYWQgPT0gbnVsbCApCgkJCXJldHVybiBudWxsOwogCgkJTm9kZSBzbG93LCBmYXN0OwoJCXNsb3cgPSBoZWFkOwoJCWZhc3QgPSBoZWFkOwogCgkJd2hpbGUoZmFzdCAhPSBudWxsICYmIGZhc3QubmV4dCAhPSBudWxsICYmIGZhc3QubmV4dC5uZXh0ICE9IG51bGwpewoJCQlzbG93ID0gc2xvdy5uZXh0OwoJCQlmYXN0ID0gZmFzdC5uZXh0Lm5leHQ7CgkJfQoJCXJldHVybiBzbG93OwogCgl9CiAKIAlwdWJsaWMgTm9kZSBtZXJnZShOb2RlIGZpcnN0LCBOb2RlIHNlY29uZCl7CiAJCQogCQlOb2RlIGhlYWQgPSBudWxsOwogCQl3aGlsZShmaXJzdCAhPSBudWxsICYmIHNlY29uZCAhPSBudWxsKXsKIAkJCQogCQkJaWYoZmlyc3QuZGF0YSA8IHNlY29uZC5kYXRhKXsKIAkJCQlpZihoZWFkID09IG51bGwpewogCQkJCQloZWFkID0gbmV3IE5vZGUoZmlyc3QuZGF0YSk7CiAJCQkJfQogCQkJCWVsc2UKIAkJCQkJaGVhZC5hcHBlbmQoaGVhZCxmaXJzdC5kYXRhKTsKIAkJCQlmaXJzdCA9IGZpcnN0Lm5leHQ7CiAJCQl9CiAJCQllbHNlIGlmKHNlY29uZC5kYXRhIDwgZmlyc3QuZGF0YSl7CiAJCQkJCWlmKGhlYWQgPT0gbnVsbCl7CiAJCQkJCWhlYWQgPSBuZXcgTm9kZShzZWNvbmQuZGF0YSk7CiAJCQkJfQogCQkJCWVsc2UKIAkJCQkJaGVhZC5hcHBlbmQoaGVhZCxzZWNvbmQuZGF0YSk7CiAJCQkJc2Vjb25kID0gc2Vjb25kLm5leHQ7CiAJCQl9CiAJCQllbHNlewogCQkJCQlpZihoZWFkID09IG51bGwpewogCQkJCQkJaGVhZCA9IG5ldyBOb2RlKGZpcnN0LmRhdGEpOwogCQkJCQkJaGVhZC5hcHBlbmQoaGVhZCxzZWNvbmQuZGF0YSk7CiAJCQkJCX0KIAkJCQkJZWxzZXsKIAkJCQkJCWhlYWQuYXBwZW5kKGhlYWQsZmlyc3QuZGF0YSk7CiAJCQkJCQloZWFkLmFwcGVuZChoZWFkLHNlY29uZC5kYXRhKTsKIAkJCQkJfQogCQkJCXNlY29uZCA9IHNlY29uZC5uZXh0OwogCQkJCWZpcnN0ID0gZmlyc3QubmV4dDsKIAkJCX0KIAkJfQkKIAkJCXdoaWxlKGZpcnN0ICE9IG51bGwpewogCQkJCWlmKGhlYWQgPT0gbnVsbCl7CiAJCQkJCWhlYWQgPSBuZXcgTm9kZShmaXJzdC5kYXRhKTsKIAkJCQl9CiAJCQkJZWxzZQogCQkJCQloZWFkLmFwcGVuZChoZWFkLGZpcnN0LmRhdGEpOwogCQkJCWZpcnN0ID0gZmlyc3QubmV4dDsKIAkJCX0KIAkJCQogCQkJCXdoaWxlKGZpcnN0ICE9IG51bGwpewogCQkJCWlmKGhlYWQgPT0gbnVsbCl7CiAJCQkJCWhlYWQgPSBuZXcgTm9kZShmaXJzdC5kYXRhKTsKIAkJCQl9CiAJCQkJZWxzZQogCQkJCQloZWFkLmFwcGVuZChoZWFkLGZpcnN0LmRhdGEpOwogCQkJCWZpcnN0ID0gZmlyc3QubmV4dDsKIAkJCQl9CiAJCQkJCiAJCQkJd2hpbGUoc2Vjb25kICE9IG51bGwpewogCQkJCWlmKGhlYWQgPT0gbnVsbCl7CiAJCQkJCWhlYWQgPSBuZXcgTm9kZShzZWNvbmQuZGF0YSk7CiAJCQkJfQogCQkJCWVsc2UKIAkJCQkJaGVhZC5hcHBlbmQoaGVhZCxzZWNvbmQuZGF0YSk7CiAJCQkJc2Vjb25kID0gc2Vjb25kLm5leHQ7CiAJCQl9CiAJCQkJCiAJCQkKIAkJcmV0dXJuIGhlYWQ7CQogCX0KIAkKCXB1YmxpYyBOb2RlIG1lcmdlU29ydChOb2RlIGhlYWQpewogCgkJaWYoaGVhZCA9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKIAoJCWlmKGhlYWQubmV4dCA9PSBudWxsKQoJCQlyZXR1cm4gaGVhZDsKIAoJCU5vZGUgZmlyc3QgPSBoZWFkOwoJCU5vZGUgbWlkID0gZmluZE1pZGRsZShmaXJzdCk7CgkJTm9kZSBzZWNvbmQgPSBtaWQubmV4dDsKCQltaWQubmV4dCA9IG51bGw7CgkJTm9kZSBsZWZ0ID0gbWVyZ2VTb3J0KGZpcnN0KTsKCQlOb2RlIHJpZ2h0ID0gbWVyZ2VTb3J0KHNlY29uZCk7CgkJTm9kZSByZXN1bHQgPSBtZXJnZShsZWZ0LCByaWdodCk7CgkJcmV0dXJuIHJlc3VsdDsKIAoJfQogCglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlOb2RlIGhlYWQgPSBuZXcgTm9kZSg1KTsKCQloZWFkLmFwcGVuZChoZWFkLDEpOwoJCWhlYWQuYXBwZW5kKGhlYWQsNSk7CgkJaGVhZC5hcHBlbmQoaGVhZCwxKTsKCQloZWFkLmFwcGVuZChoZWFkLDUpOwoJCWhlYWQuYXBwZW5kKGhlYWQsMyk7CiAJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5zb3JldGVkIGxpbmtlZCBsaXN0OiIpOwoJCWhlYWQuZGlzcGxheSgpOwoJCUlkZW9uZSB0bXAgPSBuZXcgSWRlb25lKCk7CgkJTm9kZSByZXN1bHQgPSB0bXAubWVyZ2VTb3J0KGhlYWQpOwoJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5Tb3J0ZWQgbGlua2VkIGxpc3Q6Iik7CiAJCXJlc3VsdC5kaXNwbGF5KCk7Cgl9Cn0=