在 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)
{
int len = GetLength(head);
if (len == 0 || len == 1)
return head;
return Merge(head, 0, len - 1);
} int GetLength(ListNode* head)
{
int cnt = 0;
while (head)
{
cnt++;
head = head->next;
}
return cnt;
} ListNode* Merge(ListNode *head, int start, int end)
{
if (head == NULL || start > end)
{
return NULL;
}
if (start == end)
{
return new ListNode(head->val);
}
//
int mid = (start + end) / 2;
int cnt = mid;
ListNode* head1 = head;
while (cnt-- && head1 ->next != NULL)
{
head1 = head1->next;
}
head1 = head1 ->next;
head = Merge(head, start, mid);
//如果写mid + 1,end会出错,因为是链表,不是数组,而且head1已经到了第二个分治的链表的头部
head1 = Merge(head1, 0, (end - mid - 1));
ListNode *newHead = NULL;
ListNode* lastNode = NULL;
while (head != NULL && head1 != NULL)
{
if (head->val > head1->val)
{
if (lastNode == NULL)
{
newHead = new ListNode(head1->val);
lastNode = newHead;
}
else
{
lastNode->next = new ListNode(head1->val);
lastNode = lastNode->next;
}
head1 = head1->next;
}
else
{
if (lastNode == NULL)
{
newHead = new ListNode(head->val);
lastNode = newHead;
}
else
{
lastNode->next = new ListNode(head->val);
lastNode = lastNode->next;
}
head = head->next;
}
} while (head != NULL)
{
if (lastNode == NULL)
{
newHead = new ListNode(head->val);
lastNode = newHead;
}
else
{
lastNode->next = new ListNode(head->val);
lastNode = lastNode->next;
}
head = head->next;
}
while (head1 != NULL)
{
if (lastNode == NULL)
{
newHead = new ListNode(head1->val);
lastNode = newHead;
}
else
{
lastNode->next = new ListNode(head1->val);
lastNode = lastNode->next;
}
head1 = head1->next;
}
return newHead;
}
};

推荐做法:

1,快慢指针找中点;

2,递归调用mergeSort,

3,合并两个链表

class Solution {
public:
ListNode* sortList(ListNode* head) {
return mergeSort(head);
} ListNode* mergeSort(ListNode* node) {
if (!node || !node->next) return node;
//快慢指针
ListNode* fast = node;
ListNode* slow = node;
ListNode* breakN = node;
while (fast && fast->next) {
fast = fast->next->next;
breakN = slow;
slow = slow->next;
}
breakN->next = nullptr;
ListNode *l1 = mergeSort(node);
ListNode *l2 = mergeSort(slow);
return merge(l1, l2);
} ListNode* merge(ListNode* l1, ListNode* l2) {
//递归到底的情况
if (l1 == nullptr) return l2;
if (l2 == nullptr) return l1;
//分情况递归
if (l1->val <= l2->val) {
l1->next = merge(l1->next, l2);
return l1;
} else {
l2->next = merge(l2->next, l1);
return l2;
}
}
}

Leetcode148. Sort List排序链表的更多相关文章

  1. LeetCode OJ:Sort List(排序链表)

    Sort a linked list in O(n log n) time using constant space complexity. 题目要求在常数控件内以O(nlogn)的事件复杂度来排序链 ...

  2. 【leetcode-148】排序链表

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

  3. LeetCode 148. 排序链表(Sort List)

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

  4. [Swift]LeetCode23. 合并K个排序链表 | Merge k Sorted Lists

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  5. K个排序链表的合并(Hard)

    问题来源:选自leetCode 23:合并K个排序链表 问题描述: 题目给定信息: 不确定需要合并的链表的数目,但依然要求我们把给定的这些有序链表合并成一个链表,并且保证合并的链表依然是有序的. 问题 ...

  6. LeetCode--023--合并K个排序链表

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1-&g ...

  7. 【LeetCode】23.合并K个排序链表

    题目描述 23.合并K个排序链表 合并k个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...

  8. Java实现 LeetCode 148 排序链表

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

  9. 算法基础~链表~排序链表的合并(k条)

    算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...

随机推荐

  1. 秒懂机器学习---分类回归树CART

    秒懂机器学习---分类回归树CART 一.总结 一句话总结: 用决策树来模拟分类和预测,那些人还真是聪明:其实也还好吧,都精通的话想一想,混一混就好了 用决策树模拟分类和预测的过程:就是对集合进行归类 ...

  2. 11.RabbitMQ单机集群

    RabbitMQ集群设计用于完成两个目标:允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行,以及通过添加更多的节点来扩展消息通信的吞吐量. RabbitMQ会始终记录以下四种类型的内部元数 ...

  3. WinDbg解决BHO不加载

    昨天zhengwei同学说他机器上的一个BHO不能正常加载,我把BHO的代码拿过来,在我的两台机器上都验证了一下,一台是Win7+IE8的环境,一台是XP+IE7的环境,都能正常加载.zhengwei ...

  4. PMP-49个过程快速导览

    启动过程组 名正言顺 人鬼佛神 01 -4.1制定项目章程 -授权PM,启动项目 ● 编写一份正式批准项目并授权项目经理在项目活动中使用组织资源的文件的过程 ● 明确项目与组织战略目标之间的联系,确立 ...

  5. Java oop创建自定义异常

    package com.test; /** *不管是在方法定义时就使用try catch,还是在定义方法时将异常抛出在调用方法时使用try catch都能达到效果 * */public class M ...

  6. 使用当前平台的 gcc 编译内核头文件

    [arm@localhost tchain3.4.4]#cd ${KERNEL} [arm@localhost kernel]#tar xvfz linux­2.6.14.1.tar.gz [arm@ ...

  7. canvas插入图片设置背景,渐变

    ##在canvas中插入图片(需要image对象) 1.canvas操作图片时,必须要等图片加载完才能操作 2.drawImage(image, x, y, width, height) 其中 ima ...

  8. Navicat Premium下载、安装、破解

    Navicat Premium 是一套数据库管理工具,让你以单一程序同時连接到 MySQL.MariaDB.SQL Server.SQLite.Oracle 和 PostgreSQL 数据库. 此外, ...

  9. python: 函数递归与尾递归

    如果一个函数在内部调用自己,那么这个函数就是递归函数. 例如一个阶乘函数:fact(n)=n! ,其实可以写成 fact(n)=n x fact(n-1). fact(n) 以递归的方式可以表示为: ...

  10. Date()日期转换和简单计算

    /** * 判断是否为闰年 * @param year * @return */ public boolean isLeap ( int year ) { if ( (year % 4 == 0 &a ...