zoukankan      html  css  js  c++  java
  • Leetcode 148. 排序链表

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

    示例 1:

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

    示例 2:

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

    class Solution {
    
    public:
    
        ListNode* sortList(ListNode* head) {
            ListNode newHead(0);//头结点
            newHead.next = head;
            ListNode* p = head;
            int length = 0;
            while (p) {//统计长度
                length++;
                p = p->next;
            }
            for (int size = 1; size < length; size*=2) {//size*=2
                ListNode* cur = newHead.next;
                ListNode* tail = &newHead;
                while (cur) {
                    ListNode* left = cur;//要合并的左部链表的第一个结点
                    ListNode* right = cut(left, size); // 要合并的右部分链表的第一个结点 left->@->@ right->@->@->@...
                    cur = cut(right, size); //下次要合并的左部分链表 left->@->@ right->@->@  cur->@->...//下一次while的开头
    
                    tail->next = merge(left, right);//执行合并 然后挂在tail后
                    while (tail->next) {
                        tail = tail->next;//重新找到tail
                    }
                }
            }
            return newHead.next;
        }
        //对链表head 从第n个截断 然后返回截断后第二个的头
        ListNode* cut(ListNode* head, int n) {
            ListNode* p = head;
            while (--n && p) {
                p = p->next;
            }
            if (!p) return nullptr;
            ListNode* next = p->next;
            p->next = nullptr;
            return next;
        }
        //两个有序链表归并
        ListNode* merge(ListNode* l1, ListNode* l2) {
            ListNode newHead(0);
            ListNode* p = &newHead;
            while (l1 && l2) {
                if (l1->val < l2->val) {
                    p->next = l1;
                    p = l1;
                    l1 = l1->next;
                }
                else {
                    p->next = l2;
                    p = l2;
                    l2 = l2->next;
                }
            }
            p->next = l1 ? l1 : l2;
            return newHead.next;
        }
    };
  • 相关阅读:
    5.CSS的引入方式
    4 CSS文本属性
    3.CSS字体属性
    CSS基础选择器总结
    详细介绍jQuery.outerWidth() 函数具体用法
    highcharts x轴中文刻度太长换行
    css 兼容ie8 rgba()用法
    JavaScript常用定义和方法
    12 个 CSS 高级技巧汇总
    javascript 经典问题汇总
  • 原文地址:https://www.cnblogs.com/lancelee98/p/13224098.html
Copyright © 2011-2022 走看看