Description
归并排序是链表排序的最佳方法,因为它不需要额外的空间,且运行时间是线性对数级别的。
这里的代码是从网页:http://www.dontforgettothink.com/2011/11/23/merge-sort-of-linked-list/
拷贝来的。这里要谢谢原作者
Code
private class Node {
Comparable info;
Node next;
}
Node head;
Node tail;
public Node merge_sort(Node head){
if (head == null || head.next == null) {
return head;
}
Node middle = getMiddle(head); //get the middle of the list
Node sHalf = middle.next; middle.next = null; //split the list into two halfs
return merge(merge_sort(head),merge_sort(sHalf)); //recurse on that;
}
public Node merge(Node a, Node b){
Node dummyHead, curr; dummyHead = new Node(); curr = dummyHead;
while (a!=null && b!=null){
if (!less(b.info, a.info)) {curr.next = a; a = a.next;}
else { curr.next = b; b = b.next;}
curr=curr.next;
}
curr.next = (a == null) ? b : a;
return dummyHead.next;
}
public Node getMiddle(Node head){
if (head == null) {return head;}
Node slow, fast; slow = fast = head;
while(fast.next != null && fast.next.next != null){
slow = slow.next; fast = fast.next.next;
}
return slow;
}
private static boolean less(Comparable v, Comparable w){
return v.compareTo(w) < 0;
}
Ref:
- http://www.dontforgettothink.com/2011/11/23/merge-sort-of-linked-list/