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

  • 相关阅读:
    BigDecimal.setScale 处理java小数点
    JS判断用户手机是IOS还是Android
    h5 移动端 监听软键盘弹起、收起
    【java】查重类的实现
    MySQL ORDER BY IF() 条件排序
    版本回退
    Log4j 配置某个类中某个方法的输出日志到指定文件
    简单地实现文章的查重
    simhash算法
    mysql中 for update 使用
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8445632.html
Copyright © 2011-2022 走看看