给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。示例 1:输入:head = [4,2,1,3]
输出:[1,2,3,4]
示例 2:输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:输入:head = []
输出:[]

思路:

分割、排序环节:首先找到当前链表中点,并从中点将链表断开,以便在下次递归分割排序 时,链表片段拥有正确边界:

我们使用 fast,slow 快慢双指针法,奇数个节点找到中点,偶数个节点找到中心左边的节点。 找到中点 slow 后,执行 slow.next = None 将链表切断。

递归分割时,输入当前链表左端点 head 和中心节点 slow 的下一个节点 mid(因为链表是 从 slow 切断的)。

递归终止条件:当 head.next == None 时,说明只有一个节点了,直接返回此节点。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:if head == None:return Noneif head.next == None:return head# 双指针寻找链表中点slow = headfast = headwhile fast.next != None and fast.next.next != None:slow = slow.nextfast = fast.next.next# 中点处切断,得到两个链表mid = slow.nextslow.next = None# 递归l1 = self.sortList(head)l2 = self.sortList(mid)return self.merge(l1, l2)def merge(self, l1, l2):dummpy = ListNode(0)cur = dummpywhile l1 != None or l2 != None:if l1 == None:cur.next = l2breakif l2 == None:cur.next = l1breakif l1.val >= l2.val:cur.next = ListNode(l2.val)cur = cur.nextl2 = l2.nextelse:cur.next = ListNode(l1.val)cur = cur.nextl1 = l1.nextreturn dummpy.next

83. Leetcode 148. 排序链表 (排序)相关推荐

  1. c语言单链表的字母排序,链表排序——选择排序法(纯C语言版)

    /********************************* 链表的排序 *******************************************/ /* =========== ...

  2. 【LeetCode 148】链表的归并排序

    上一篇文章用数组实现了二路归并排序,核心在于要对每次减半的元素进行实质性的改变,在数组中我们用临时数组记录每次merge的结果,在链表中用归并排序更加直接,因为我们操作的是结点的指针. 题目描述 难度 ...

  3. 【编程4】插入排序+快速排序+LeetCode.148(排序链表)

    文章目录 一.排序链表 1.题目描述--LeetCode.148 2.分析 (1)一般的快排 (2)解题思路 3.实现 二.排序算法 三.插入排序 1.基本思想 (1)过程概述 (2)具体算法描述: ...

  4. 【LeetCode】【HOT】148. 排序链表(归并排序)

    [LeetCode][HOT]148. 排序链表 文章目录 [LeetCode][HOT]148. 排序链表 package hot;import java.util.Arrays;class Lis ...

  5. 链表排序---迭代版本归并算法 + [leetcode]148. 排序链表

    前言: 对于链表来说,排序首选应该是归并算法 维基百科上有归并算法的迭代版本和递归版本 基于数组实现的. https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B ...

  6. LeetCode Algorithm 148. 排序链表

    148. 排序链表 Ideas 链表结构的经典题目. 不过我不想用经典方法做,哎,就是皮. 我把链表元素都拷贝到数组中,然后对数组排序,之后再把排完序之后的值赋回去. 骚的一批. Code Pytho ...

  7. LeetCode Algorithm 83. 删除排序链表中的重复元素

    83. 删除排序链表中的重复元素 Ideas 这题挺简单的,直接一次遍历,如果当前遍历的元素val跟下一个元素的val相等,说明是重复元素,直接把当前item的next指向item->next- ...

  8. LeetCode 83. 删除排序链表中的重复元素(链表)

    1. 题目 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2示例 2: 输入: 1->1->2-> ...

  9. leetcode No.83 删除排序链表中的重复元素

    题目 链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list 给定一个排序链表,删除所有重复的元素,使得每个元素只 ...

最新文章

  1. pythonselect a valied_python 11期 第五天
  2. 亚马逊专家揭秘:如何建立自动检测乳腺癌的深度学习模型
  3. 一个电脑白痴与黑客的对话
  4. HDU 4288 Coder [线段树]
  5. console linux 口 没输出_Console很飒,不止log
  6. springboot的yml自定义值的笔记
  7. 在 ASP.NET Core 中集成 Skywalking APM
  8. 数学特级教师:数学除了做题目,我还必须让他们看这些!
  9. windows安装java环境
  10. Struts2 继承ActionSupport类
  11. 电子沙盘 数字沙盘 开发教程
  12. android人脸识别的背景图_Android原生人脸识别Camera2+FaceDetector 快速实现人脸跟踪...
  13. XXL 定时任务实现
  14. 神经网络模型用于数学建模
  15. 数据科学与大数据技术和计算机科学与技术哪个好
  16. android手机图片质量,安卓手机对比iOS照片在微信分享时,竟大幅深压缩画质?...
  17. 量化金融论文:Astock
  18. 教你简单学会用Python画长草颜团子
  19. 人生若只如初见时[收藏]
  20. iso镜像文件怎么装系统图文操作

热门文章

  1. Lesson 4- Exchange Server 2010 Publish
  2. proxool数据库连接池用法
  3. 据阿里云EMR快速搭建数据平台(二)
  4. spring配置的相关文章
  5. 【转】tcp链接的状态
  6. VMware workstation 7.1 安装错误提示1021解决方法
  7. 理解Windows中的路由表和默认网关
  8. TCP/IP协议中常用端口表
  9. 单调队列板子:求滑动窗口中最大值和最小值
  10. 最小生成树(MST)