描述
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
分析
链表适合归并排序,排序操作更加简单。
- 首先递归把链表分成半
- 在每次递归中执行由大到小得合并操作,然后每次递归都能得到得有序链表。
class Solution {
public ListNode sortList(ListNode head) {
if(head == null){
return head;
}
return mergeSort(head);
}
public ListNode mergeSort(ListNode head){
if(head.next == null){
return head;
}
ListNode p = head, q = head, node = null;
while(q != null && q.next != null){
node = p;
p = p.next;
q = q.next.next;
}
node.next = null;
ListNode l = mergeSort(head);
ListNode r = mergeSort(p);
return merge(l,r);
}
public ListNode merge(ListNode l, ListNode r){
ListNode dummy = new ListNode(0);
ListNode cur = dummy;
while(l != null && r != null){
if(l.val < r.val){
cur.next = l;
l = l.next;
cur = cur.next;
}else{
cur.next = r;
r = r.next;
cur = cur.next;
}
}
if(l != null){
cur.next = l;
}
if(r != null){
cur.next = r;
}
return dummy.next;
}
}