题目描述

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

示例 1:

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

示例 2:

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

解题思路

本题其实是让用归并排序的思想对链表进行排序,分为两个阶段:首先将整个链表分为两部分,一般是从中间切开,对两部分分别进行排序;然后将两个排序好的链表合并成一个链表。下面分别对两步进行分析:

  1. 将链表分为两部分时,要首先找到中间节点,考虑用快慢指针的方法,快指针每次走两步,慢指针每次走一步,这样当快指针无路可走即下两步出现空指针时,慢指针正好处于链表中间节点。然后从慢指针后把整个链表切成两半,两部分再分别进行递归排序
  2. 将两个排序链表合并时,首先初始化一个伪头节点,用其next指针指向新链表的头节点。从两个排序链表的头节点开始比较,每次将值较小的节点拼接到新链表后,若遇到其中一个节点为空则将另一个链表拼接到新链表后,这样遍历到两个链表末尾,最后返回伪头节点的next指针

代码

 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(head == NULL || head->next == NULL)
return head;
ListNode *quick = head, *slow = head;
//快慢指针找到中间节点
while(quick->next && quick->next->next){
quick = quick->next->next;
slow = slow->next;
}
quick = slow;
slow = slow->next;
quick->next = NULL;
ListNode *first = sortList(head);
ListNode *second = sortList(slow);
return mergeList(first, second);
}
ListNode* mergeList(ListNode* first, ListNode* second){
ListNode node(-);
ListNode *p = &node;
while(first != NULL || second != NULL){
int val1 = first == NULL ? INT_MAX : first->val;
int val2 = second == NULL ? INT_MAX : second->val;
if(val1 < val2){
p->next = first;
first = first->next;
}
else{
p->next = second;
second = second->next;
}
p = p->next;
}
return node.next;
}
};

LeetCode 148. 排序链表(Sort List)的更多相关文章

  1. Java实现 LeetCode 148 排序链表

    148. 排序链表 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3-> ...

  2. [LeetCode] 148. 排序链表 ☆☆☆(归并排序)

    148.排序链表 描述 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3输出: 1->2->3-> ...

  3. [Leetcode]148. 排序链表(归并排序)

    题目 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: ...

  4. LeetCode 148 排序链表

    题目: 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2 ...

  5. LeetCode 148——排序链表

    1. 题目 2. 解答 2.1 快速排序 可参考 快速排序和归并排序 中的第一种快速排序思想,与在数组中排序有两点不同. 第一,我们需要取最后一个元素作为主元,在数组中可以直接访问到最后一个元素,但在 ...

  6. leetcode 148. 排序链表(c++)

    在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3输出: 1->2->3->4示例 2: 输入: ...

  7. leetcode 148排序链表

    优先队列容器,使用小顶堆排序:timeO(nlogn) spaceO(n) /** * Definition for singly-linked list. * struct ListNode { * ...

  8. [Swift]LeetCode148. 排序链表 | Sort List

    Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4->2-> ...

  9. LeetCode 912. 排序数组(Sort an Array) 43

    912. 排序数组 912. Sort an Array 题目描述 每日一算法2019/6/15Day 43LeetCode912. Sort an Array

随机推荐

  1. O020、理解 Glance

    参考https://www.cnblogs.com/CloudMan6/p/5384923.html   OpenStack 由 Glance 提供 Image 服务.   理解 Glance    ...

  2. 深入简出mysql--第一部分

    第二章: 1.sql分类 DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段.数据库.表.列.索引等数据库对象的定义. 常用的语句关键字主要包括 ...

  3. 自己实现一个简化版的SpringMVC框架

    废话不多说,我们进入今天的正题,在Web应用程序设计中,MVC模式已经被广泛使用.SpringMVC以DispatcherServlet为核心,负责协调和组织不同组件以完成请求处理并返回响应的工作,实 ...

  4. Spring Boot 实际操作

    1.什么是springboot 2.springboot的很多默认编码方式都是utf-8,真是福利啊. 3.spring boot如何启动和访问和MocMvc测试 4.开发环境的调试热启动 5.app ...

  5. Js 将图片的绝对路径转换为base64编码

    转.... 我们可以使用canvas.toDataURL的方法将图片的绝对路径转换为base64编码:在这我们引用的是淘宝首页一张图片如下:  var img = "https://img. ...

  6. mysql在某一字段后面添加新字段

    mysql在某一字段后面添加新字段 ALTER TABLE `test` ADD `anyField` TEXT NOT NULL AFTER `id`

  7. MST-prim ElogV

    #include<bits/stdc++.h> #define ll long long using namespace std; ; ; struct node { int t;int ...

  8. GO (待更新)

    日期20190531,GO AND TOOLS FOR HOME 0  环境搭建 https://golang.org/dl/ Install the Go tools If you are upgr ...

  9. SQL练习02

    编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+| Id | Salary |+----+--------+| 1 | 100 || ...

  10. TCP/IP 协议栈4层结构及3次握手4次挥手

    TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输.TCP/IP 协议采用4层结构,分别是应用层.传输层.网络层和链路 ...