因为需要时间复杂度为O(nlogn)所以考虑使用归并排序。ListNode不同于数组,因此要重写合并的方法和找中点的方法。这边找中点使用两个指针,一个快,一个慢。当慢指针到达链表尾端时,快指针到达链表中间。
/**
* Created by marsares on 15/6/9.
*/
public class SortList {
public ListNode sortList(ListNode head) {
if(head==null)return null;
if(head.next==null)return head;
ListNode mid=getMiddleNode(head);
return mergeTwoLists(sortList(head),sortList(mid));
}
public ListNode getMiddleNode(ListNode l){
ListNode slow=l;
ListNode fast=l;
ListNode tmp=null;
while(fast!=null){
if(fast.next==null)break;
tmp=slow;
slow=slow.next;
fast=fast.next.next;
}
tmp.next=null;
return slow;
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null)return l2;
if(l2==null)return l1;
ListNode current=null;
if(l1.val<l2.val){
current=l1;
l1=l1.next;
}
else{
current=l2;
l2=l2.next;
}
ListNode first=current;
while(l1!=null&&l2!=null){
if(l1.val<l2.val){
current.next=l1;
l1=l1.next;
}else{
current.next=l2;
l2=l2.next;
}
current=current.next;
}
if(l1==null)current.next=l2;
if(l2==null)current.next=l1;
return first;
}
public void printList(ListNode l){
if(l==null)return;
while(l.next!=null){
System.out.print(l.val+"->");
l=l.next;
}
System.out.println(l.val);
}
public static void main(String[]args){
SortList sl=new SortList();
ListNode n1=new ListNode(5);
ListNode n2=new ListNode(1);
ListNode n3=new ListNode(2);
ListNode n4=new ListNode(4);
ListNode n5=new ListNode(3);
n1.next = n2;
n2.next=n3;
n3.next=n4;
n4.next=n5;
sl.printList(n1);
sl.printList(sl.sortList(n1));
/*ListNode m=sl.getMiddleNode(n1);
sl.printList(n1);
sl.printList(m);
ListNode m1=sl.getMiddleNode(n1);
sl.printList(n1);
sl.printList(m1);
sl.printList(sl.mergeTwoLists(n1,m1));*/
}
}