diff --git a/src/chapter03linkedlists/MergeSortLinkedList.java b/src/chapter03linkedlists/MergeSortLinkedList.java new file mode 100644 index 0000000..36b5eec --- /dev/null +++ b/src/chapter03linkedlists/MergeSortLinkedList.java @@ -0,0 +1,71 @@ +class LinkedListNode { + T data; + LinkedListNode next; + + public LinkedListNode(T data) { + this.data = data; + } +} + +public class MergeSortLinkedList{ + + public static LinkedListNode mergeSort(LinkedListNode head) { + +if (head == null || head.next == null) { + return head; + } + + LinkedListNode middle = getMiddle(head); + LinkedListNode nextofmiddle = middle.next; + + middle.next = null; + + LinkedListNode left = mergeSort(head); + + LinkedListNode right = mergeSort(nextofmiddle); + + LinkedListNode sortedlist = sortedMerge(left, right); + return sortedlist; + } + public static LinkedListNode sortedMerge(LinkedListNode a, LinkedListNode b) + { + LinkedListNode result = null; + if (a == null) + return b; + if (b == null) + return a; + + if (a.data <= b.data) { + result = a; + result.next = sortedMerge(a.next, b); + } + else { + result = b; + result.next = sortedMerge(a, b.next); + } + return result; + } + + + + public static LinkedListNode getMiddle(LinkedListNode h) + { + if (h == null) + return h; + LinkedListNode fastptr = h.next; + LinkedListNode slowptr = h; + + while (fastptr != null) { + fastptr = fastptr.next; + if (fastptr != null) { + slowptr = slowptr.next; + fastptr = fastptr.next; + } + } + return slowptr; + } + + + + +} \ No newline at end of file