代码改变世界

排序链表

2018-11-30 20:17  YihangZhou  阅读(141)  评论(0编辑  收藏  举报

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4

示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        return head==null?null:mergeSort(head);
    }
    public ListNode mergeSort(ListNode head){
        if(head.next==null){
            return head;
        }
        ListNode p=head,q=head,pre=null;
        while(q!=null&&q.next!=null){
            pre=p;
            p=p.next;
            q=q.next.next;
        }
        pre.next=null;
        ListNode l=mergeSort(head);
        ListNode r=mergeSort(p);
        return merge(l,r);
    }
    public ListNode merge(ListNode l,ListNode r){
        ListNode dummyHead=new ListNode(0);
        ListNode cur=dummyHead;
        while(l!=null&&r!=null){
            if(l.val<r.val){
                cur.next=l;
                cur=cur.next;
                l=l.next;
            }
            else{
                cur.next=r;
                cur=cur.next;
                r=r.next;
            }
           
        }
        if(l!=null){
            cur.next=l;
        }
        if(r!=null){
            cur.next=r;
        }
        return dummyHead.next;
    }
}