归并排序:
public ListNode merge(ListNode head1, ListNode head2){
ListNode temp = new ListNode(-1);
ListNode cur = temp;
while(head1 != null && head2 != null){
if(head1.val <= head2.val){
cur.next = head1;
head1 = head1.next;
}
else{
cur.next = head2;
head2 = head2.next;
}
cur = cur.next;
}
if(head1 != null){
cur.next = head1;
}
if(head2 != null){
cur.next = head2;
}
return temp.next;
}
public ListNode sortList(ListNode head, ListNode tail){
if(head == null ){
return head;
}
//切掉尾巴,分成两个数组
if(head.next == tail){
head.next = null;
return head;
}
ListNode slow = head;
ListNode fast = head;
while(fast != tail){
slow = slow.next;
fast = fast.next;
if( fast != tail) fast = fast.next;
}
ListNode mid = slow;
ListNode head1 = sortList(head, mid);
ListNode head2 = sortList(mid, tail);
ListNode result = merge(head1, head2);
return result;
}
public ListNode sortList(ListNode head) {
return sortList(head, null);
}
时间 o(nlogn) 空间O(logn)
P.S.:链表一般会new一个新节点指向head节点,当head节点发生变动的时候方便处理。另外一定要多判断是不是空指针,尤其是有next的时候。