在 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. mac 安装配置使用 mongoldb

    mac 安装配置使用 mongoldb 安装和配置 brew install mongos brew install mongo # 密码就是用户的密码 # 配置数据文件 //如果不配置会出现错误62 ...

  2. Python正则表达式如何进行字符串替换实例

    Python正则表达式如何进行字符串替换实例 Python正则表达式在使用中会经常应用到字符串替换的代码.有很多人都不知道如何解决这个问题,下面的代码就告诉你其实这个问题无比的简单,希望你有所收获. ...

  3. AT指令集之Call

    1.//unsolicited result code,URC表示BP->AP+ESIPCPI:<call_id>,<dir>,<sip_msg_type>, ...

  4. 从0的1学习JavaSE,Jdk的安装

    一.常用的dos命令 dir 罗列出当前目录的下所有文件名字 cd 路径 切换路径,该路径可以是相对于路径也可以是绝对路径 相对路径,只相对于当前的目录下的文件 绝对路径,是从盘符开始的路径地址 注意 ...

  5. linux安装openoffice,并解决中文乱码

    1.安装openoffice 官网http://www.openoffice.org/zh-cn/download/下载 2.解压并进入文件夹: cd /zh-cn/RPMS yum localins ...

  6. PE头里的东西更多。。。越看越恶心了,我都不想看了

    winnt.h 中,定义的PE头结构体 typedef struct _IMAGE_NT_HEADERS{DWORD Signature;//PE文件头标志:PE\0\0.在开始DOS header的 ...

  7. 2019牛客暑期多校训练营(第八场) E 线段树+可撤销并查集

    题目传送门 题意: 给出m条无向边,每条边都有一个$[l,r]$,意思是体积在这个范围内的人才能通过这条边,询问有多少种体积的可能性,能使人从1到n 思路:由于是无向边,1和n的连通性可以用并查集维护 ...

  8. Python自学:第五章 使用函数range( )

    # -*- coding: GBK -*- for value in range(1,5): print(value) 输出为: 1 2 3 4

  9. 初识Qgis

    折腾了一天,qgis终于能在跟了自己8年的本本上顺利打开了,官网先后下载了3.8和3.4版本的都出现了同样的问题,"could not load qgis_app.dll",goo ...

  10. python使用PIL处理图片后返回给前端的坑

    一.python代码 这里有个坑,之前没有将bytes图片数据转成base64就返回到前端了,但在前端处理的时候,怎么都显示不出图片来,虽然数据拿到了,但bytes被传到前后变str了,所以怎么搞都没 ...