码迷,mamicode.com
首页 > 编程语言 > 详细

[LeetCode]148. Sort List链表归并排序

时间:2018-02-12 22:24:06      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:拼接   www.   个数   tar   时间   amp   col   死循环   pre   

要求时间复杂度O(nlogn),空间复杂度O(1),采用归并排序

传统的归并排序空间复杂度是O(n),原因是要用一个数组表示合并后的数组,但是这里用链表表示有序链表合并后的链表,由于链表空间复杂度是O(1),所以可以。

链表问题经常出现TLE问题或者MLE问题,这时候要检查链表拼接过程或者循环过程,看有没有死循环

public ListNode sortList(ListNode head) {
        if (head==null||head.next==null) return head;
        //利用快慢指针找到链表中点,并分成两部分递归
        //要设置一个超前节点记录慢指针前一个节点作为前部分末尾
        ListNode slow = head,fast = head,pre = null;
        while (fast!=null&&fast.next!=null)
        {
            pre = slow;
            slow = slow.next;
            fast = fast.next.next;
        }
        //前半部分
        pre.next = null;
        ListNode l1 = sortList(head);
        ListNode l2 = sortList(slow);
        return merge(l1,l2);
    }
    public ListNode merge(ListNode l1,ListNode l2)
    {
        //设置超前节点
        ListNode pre = new ListNode(0),temp = pre;
        while (l1!=null&&l2!=null)
        {
            if (l1.val<l2.val)
            {
                temp.next = l1;
                l1 = l1.next;
            }
            else {
                temp.next = l2;
                l2 = l2.next;
            }
            temp = temp.next;
        }
        if (l1!=null) temp.next = l1;
        if (l2!=null) temp.next = l2;
        return pre.next;
    }

归并排序请看:http://www.cnblogs.com/stAr-1/p/8445377.html

[LeetCode]148. Sort List链表归并排序

标签:拼接   www.   个数   tar   时间   amp   col   死循环   pre   

原文地址:https://www.cnblogs.com/stAr-1/p/8445632.html

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