链表归并排序
public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
public static ListNode sortList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode res=mergeSort(head);
while (res!=null){
System.out.println(res.val+" ");
res=res.next;
}
return res;
}
public static ListNode mergeSort(ListNode head) {
if (head.next == null) {
return head;
}
ListNode slow = head;
ListNode fast = head;
ListNode pre = null;
//拆分链表
while (fast != null && fast.next != null) {
fast = fast.next.next;
pre = slow;
slow = slow.next;
}
pre.next = null;
ListNode l = mergeSort(head);
ListNode r = mergeSort(slow);
return merge(l, r);
}
private static ListNode merge(ListNode l, ListNode r) {
//合并链表
ListNode newHead=new ListNode(0);
ListNode cur=newHead;
while (l!=null&&r!=null){
if (l.val>r.val){
cur.next=r;
r=r.next;
cur=cur.next;
continue;
}
cur.next=l;
l=l.next;
cur=cur.next;
}
if (l==null){
cur.next=r;
}
if (r==null){
cur.next=l;
}
return newHead.next;
}