Sort List —— 归并排序

news/2024/5/17 19:01:55 标签: 归并排序, 链表, 链表排序, leetcode, 分治算法

问题描述

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

算法分析

1、要求时间复杂度为 O(n log n),可以考虑归并与快排;

2、本文使用归并,每次将链表从中间位置切断,一分为二;

3、递归2过程,直到链表长度为1;

4、依次从小到大合并两个链表,最后返回排序好的链表

C++实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
    ListNode* mergeList(ListNode* head1, ListNode* head2) {
        shared_ptr<ListNode> newHead(new ListNode(0));
        ListNode* p = newHead.get();
        while (head1 && head2) {
            if (head1->val <= head2->val) {
                p->next = head1;
                head1 = head1->next;
            }
            else {
                p->next = head2;
                head2 = head2->next;
            }
            p = p->next;
        }
        p->next = !head1 ? head2 : head1;
        return newHead->next;
    }
public:
    ListNode* sortList(ListNode* head) {
        if (!head || !head->next)
            return head;

        //devide into two lists
        ListNode* slow = head,
            *fast = head->next;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        fast = slow->next;
        slow->next = nullptr;

        return mergeList(sortList(head), sortList(fast));
    }
};

时间复杂度为O(n*log(n)),空间复杂度为O(1)。


http://www.niftyadmin.cn/n/1050836.html

相关文章

mysql derived优化_EXPLAIN sql优化方法(3)DERIVED-阿里云开发者社区

派生表和视图的性能从MySQL 4.1开始&#xff0c;它已经支持派生表、联机视图或者基本的FROM从句的子查询。这些特性之间彼此相关&#xff0c;但是它们之间的性能比较如何呢&#xff1f;MySQL 5.0 中的派生表似乎和视图实现的方式不同&#xff0c;尽管我从合并的代码基数来看觉得…

linux mysql utf8无效_linux mysql 设置utf-8解决中文无法插入问题

linux mysql 设置utf-8需要修改的文件步骤修改配置文件重启mysql服务补充说明需要修改的文件/etc/mysql/conf.d/mysql.cnf/etc/mysql/mysql.conf.d/mysqld.cnf步骤修改配置文件vi /etc/mysql/conf.d/mysql.cnf修改成如下[mysql]default-character-setutf8vi /etc/mysql/mysql.c…

mysql查询同名同姓重名人数_查全国同名同姓,怎样查重名人数查询

查全国同名同姓&#xff0c;怎样查重名人数查询时间&#xff1a;2020-05-10 20:30:01不少宝爸宝妈在给婴儿起名之时&#xff0c;会好奇在全中国有几人同名同姓&#xff0c;希望新生儿的名字不会跟太多人重合。或者有的小伙伴单纯好奇全中国同自己重名的人有多少&#xff0c;那到…

二叉树前序、中序和后序的非递归遍历

把经典问题&#xff1a;二叉树的非递归遍历理了理&#xff0c;顺便做个笔记。 核心思路就是节点的压栈和出栈。 #include <iostream> #include<stack> #include<vector> using namespace std;struct TreeNode {int val;TreeNode* left;TreeNode* right;Tre…

java堆栈计算_Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现...

1、堆栈-Stack堆栈(也简称作栈)是一种特殊的线性表&#xff0c;堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同&#xff0c;其差别是线性表允许在任意位置进行插入和删除操作&#xff0c;而堆栈只允许在固定一端进行插入和删除操作。堆栈中允许进行插入和删除操作的一…

java 读取classpath下的文件_java读取classpath下的properties文件

classpath下有resource.properties#设置邮件服务器send.email.host.namesmtp.qq.com#设置是否使用安全连接send.email.use.ssltrue#设置安全连接端口号send.email.ssl.port456#发送Email编码send.email.charsetUTF-8#发送Email用户名send.email.user.namexxxx.com#发送Email密码…

Perfect Squares——动态规划

问题描述 Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n. For example, given n 12, return 3 because 12 4 4 4; given n 13, return 2 because 13 4 9. 算法分析 考虑Sum a b …

java 对象转xml 工具类_工具类 Java对象和XML之间的相互转换-搜云库

JAXB(Java Architecture for XML Binding) 是一个业界的标准&#xff0c;是一项可以根据XML Schema产生Java类的技术。该过程中&#xff0c;JAXB也提供了将XML实例文档反向生成Java对象树的方法&#xff0c;并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲&#xf…