package com.interview.linklist; /** * Given a linklist which has individual sorted componenets sort the entire linst * e.g 1-3-6-8-4-5-10-7-9 * Here 1,2,6,8 are sorted, 4,5,10 are sorted and 7,9 are sorted * Test case * null node * 1 node * 2 sorted nodes * 2 reverse sorted nodes * 3 reverse sorted nodes * 4 nodes 2 each sorted among themselves */ public class SortNearlySortedList { public Node sort(Node head){ Node result = null; Node start = head; while(head != null && head.next != null){ if(head.data < head.next.data){ head = head.next; }else{ Node temp = head.next; head.next = null; result = mergeSort(result,start); head = temp; start = temp; } } result = mergeSort(result,start); return result; } private Node mergeSort(Node head1,Node head2){ if(head1 == null){ return head2; } if(head2 == null){ return head1; } if(head1.data <= head2.data){ head1.next = mergeSort(head1.next,head2); return head1; }else{ head2.next = mergeSort(head1,head2.next); return head2; } } public static void main(String args[]){ LinkList ll = new LinkList(); Node head = null; head = ll.addNode(1, head); head = ll.addNode(2, head); head = ll.addNode(3, head); head = ll.addNode(7, head); head = ll.addNode(5, head); head = ll.addNode(6, head); head = ll.addNode(13, head); head = ll.addNode(11, head); head = ll.addNode(12, head); SortNearlySortedList sns = new SortNearlySortedList(); head = sns.sort(head); ll.printList(head); } }