在 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. NX二次开发-UFUN替换组件UF_ASSEM_use_alternate

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_assem.h> #include <u ...

  2. cordova 与 phonegap关系

    Apache Cordova是PhoneGap贡献给Apache后的开源项目,是从PhoneGap中抽出的核心代码,是驱动PhoneGap的核心引擎.PhoneGap是一个开源的开发框架,使用HTML ...

  3. Centos7.5安装kafka集群

    Tags: kafka Centos7.5安装kafka集群 Centos7.5安装kafka集群 主机环境 软件环境 主机规划 主机安装前准备 安装jdk1.8 安装zookeeper 安装kafk ...

  4. mysql查看数据库大小或者表大小

    要想知道每个数据库的大小的话,步骤如下: 1.进入information_schema 数据库(存放了数据库的信息) use information_schema; 2.查询所有数据库的大小: sel ...

  5. HDU1556-Color the ball-前缀和/线段树/树状数组

    N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...

  6. 解决多个window.onscroll覆盖的问题

    项目中有好几处都有用到监听页面滚动window.onscroll这个函数,结果出现了后者覆盖前者的问题. 最后是通过addEventListener解决了这种共存问题.       ⚠️该处代码thi ...

  7. n-map安装实操

    强烈建议大家从官网下载nmap,而不是其他的第三方.官网地址:https://nmap.org/download.html 打开是这样的,感觉有点阴森森的色调.BTW,谁能逃得过真香定律呢. wind ...

  8. 【牛客提高训练营5B】旅游

    题目 吉老师的题时过一年还是不会做 从\(1\)号点出发经过每条边至少一次并且还要回到\(1\)号点,这跟欧拉回路的条件非常像,但是欧拉回路的实际上是"经过每一条边恰好一次并且回到出发点&q ...

  9. USACO2008 Patting Heads /// 筛数 oj24705

    题目大意: N (1 < N < 100,000)头牛被编号为1-N,围坐成圈 每头牛都被画上数字Ai (1 ≤ Ai ≤ 1,000,000),可能重复 逐个起来拍打 其他身上的数字是 ...

  10. QTP,自己主动化測试学习笔记,六月九号

    測试自己主动化实现的两个难点设计--功能分解 实现--对象的识别 測试自己主动化实现的两个难点-功能分解 清晰画出业务流程图 依据业务流程分解业务功能.能够被复用的功能也要被分解出来. 依照路径覆盖的 ...