zoukankan      html  css  js  c++  java
  • [LeetCode]148. Sort List链表归并排序

    要求时间复杂度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

  • 相关阅读:
    [hihocoder][Offer收割]编程练习赛62
    [laravel]用户异地登录后踢掉之前的登录
    [hihocoder][Offer收割]编程练习赛57
    [hihocoder][Offer收割]编程练习赛58
    线性基
    数组墙 最详细的解题报告
    MySQL中EXPLAIN命令详细解析
    MySQL性能优化
    MySQL中的事务隔离级别
    Java NIO的理解和应用
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8445632.html
Copyright © 2011-2022 走看看