在 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. Model Maker上手指南

    Model Maker上手指南 目录 1.MM可爱的脸 2.MM中的工程Project 3.新建类图 4.添加类成员 5.实现类的方法 6.生成Delphi代码 7.逆向到模型 8.完全的逆向工程 作 ...

  2. Date转换为LocalDateTime

    一.在Java 8中将Date转换为LocalDateTime 方法1: 将Date转换为LocalDatetime,我们可以使用以下方法: 1.从日期获取ZonedDateTime并使用其方法toL ...

  3. 活动:月末送Java技术书福利|抽奖

    本公众号运营了快一年了 原创干货超过200+ 收获了也快1W粉丝 这么多粉丝-- 送书活动怎能少? 虽然这次我们是有备而来 但是-- 所有书籍为作者自掏腰包 所以本次送书数量有限 不能满足到所有人 重 ...

  4. 网页添加Live2D看板娘

    看板娘简而言之就是小店的女服务生,也有“吸引顾客,招揽生意,提高人气”等作用类似品牌形象代言人的含义. 如果想放一个呆萌的看板娘在博客上 js <script type="text/j ...

  5. unity3D笔记の四种调用其他脚本方法

    第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名() 第二种,GameObject.Find("脚本所在的物体的名字").SendMessage(" ...

  6. webservice - 使用JAX-WS注解的方式快速搭建服务端和客户端

    1.Define the interface import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebRe ...

  7. go 函数和流程控制

    if/else分支判断 基本结构如下: if condition1 { } if condition1 { } else { } if condition1 { } else if condition ...

  8. 客户端IAP二次验证

    1.首先苹果IAP把每次购买抽象成了一个事务(SKPaymentTransaction), - (void)productsRequest:(SKProductsRequest *)request d ...

  9. sublime text-----查看当前文件的编码格式

    1.preferences->settings,在user中添加 "show_encoding": true, "show_line_endings": ...

  10. HTML清楚塌陷问题

    /* 清除浮动塌陷问题 */.clearfix:after { clear: both;} .clearfix:after,.clearfix:before { content: " &qu ...