package com.interview.linklist;
/**
* http://www.geeksforgeeks.org/merge-sort-for-linked-list/
* Test cases
* 0 nodes
* 1 nodes
* 2 nodes
* 3 nodes
* fully sorted
* reverse sorted
*/
public class MergeSortLinkList {
public Node sort(Node head, boolean isAscending){
if(head == null || head.next == null){
return head;
}
Node head1 = frontBackSplit(head);
head = sort(head,isAscending);
head1 = sort(head1,isAscending);
return sortedMerge(head, head1, isAscending);
}
private Node sortedMerge(Node head1, Node head2, boolean isAscending){
if(head1 == null){
return head2;
}
if(head2 == null){
return head1;
}
if(isAscending){
if(head1.data <= head2.data){
head1.next = sortedMerge(head1.next, head2, isAscending);
return head1;
}else{
head2.next = sortedMerge(head1,head2.next, isAscending);
return head2;
}
}else{
if(head1.data >= head2.data){
head1.next = sortedMerge(head1.next, head2, isAscending);
return head1;
}else{
head2.next = sortedMerge(head1,head2.next, isAscending);
return head2;
}
}
}
private Node frontBackSplit(Node head){
if(head == null){
return null;
}
Node slow = head;
Node fast = head.next;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
Node newHead = slow.next;
slow.next = null;
return newHead;
}
public static void main(String args[]){
MergeSortLinkList msll = new MergeSortLinkList();
LinkList ll = new LinkList();
Node head = null;
head = ll.addNode(11, head);
head = ll.addNode(12, head);
head = ll.addNode(-3, head);
head = ll.addNode(45, head);
head = ll.addNode(5, head);
head = msll.sort(head, false);
ll.printList(head);
}
}