码迷,mamicode.com
首页 > 其他好文 > 详细

[LintCode] Sort List

时间:2015-11-17 12:24:58      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

Sort List

Sort a linked list in O(n log n) time using constant space complexity.

Example

Given 1-3->2->null, sort it to 1->2->3->null.

 

SOLUTION:

这题是merge 2 sorted list的follow up,为什么这么说呢?因为在链表上做nlogn的排序,只有merge sort,同样的时间复杂度,也有heap sort,但是不太合适。

既然这样明确了merge sort,那么就开始,直接上递归就很方便!递归的时候需要中点,这个很麻烦,链表找中点是链表操作里比较费事儿的,但是用两个指针轻松解决,写一个findmid();,然后merge左右两边,也就是分治,left = sortlist(head),right = sortlist(mid)就ok了,分治的核心就是这一层看着一层,其他的事情交给其他层,这层就当他已经处理完了。

技术分享
/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */ 
public class Solution {
    /**
     * @param head: The head of linked list.
     * @return: You should return the head of the sorted linked list,
                    using constant space complexity.
     */
    //思路就是:分治左右两边,然后递归,然后再把左右两边当作sorted listmerge一下
    //用任何递归的想法都是,我写了这个公式的意思就是我已经排序好了。剩下的计算机自己干去
    public ListNode sortList(ListNode head) { 
        //值得注意的地方,第一次没写head.next ==null的情况
        if (head == null || head.next ==null){
            return head;
        }
        ListNode preMid = findMid(head);
        ListNode right = preMid.next;
        preMid.next = null;
        ListNode left = sortList(head);
        right = sortList(right);
        return merge(left, right);
    }
    private ListNode findMid(ListNode head){
        if (head == null){
            return head;
        }
        ListNode fast = head.next;
        ListNode slow = head;
        while (fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }
    private ListNode merge(ListNode l1, ListNode l2){
        if (l1 == null){
            return l2;
        }
        if (l2 == null){
            return l1;
        }
        ListNode dummy = new ListNode(0);
        ListNode head = dummy;
        while (l1 != null && l2 != null){
            if (l1.val < l2.val){
                head.next = l1;
                head = head.next;
                l1 = l1.next;
            } else {
                head.next = l2;
                head = head.next;
                l2 = l2.next;
            }
        }
        if (l1 != null){
            head.next = l1;
        }
        if (l2 != null){
            head.next = l2;
        }
        return dummy.next;
    }
}
View Code

 

[LintCode] Sort List

标签:

原文地址:http://www.cnblogs.com/tritritri/p/4970988.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!