LeetCode(python)——148.排序链表

题目

给你链表的头结点 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 = []
输出:[]

提示:

  • 链表中节点的数目在范围 [0, 5 * 104]
  • -105 <= Node.val <= 105

思路

用归并排序解决

1.拆分链表

(1)找中点------快慢指针找中点,但需要注意!由于存在奇偶长度的链表,所以这个中点应该是正中或者偏左一个(否则会存在死循环)

(2)分!(让中点的next = None即可)

2.按序合并(比大小即可)

代码

python 复制代码
# 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 not head or not head.next:
            return head
        fast, slow = head.next, head   # 这里一定是fast比slow多一个,否则后面拆分链表后会出现死循环~
        while fast and fast.next:   # 快慢指针找中点
            fast = fast.next.next
            slow = slow.next
        mid, slow.next = slow.next, None
        
        left, right = self.sortList(head), self.sortList(mid)   # 不断拆分

        h = res = ListNode(0)
        while left and right:   # 比大小~
            if left.val < right.val:
                h.next = left
                left = left.next
            else:
                h.next = right
                right = right.next
            h = h.next
        h.next = left if left else right   # 防止还有未参与比大小的节点,做一个特殊处理
        
        return res.next
相关推荐
vortex58 分钟前
几种 dump hash 方式对比分析
算法·哈希算法
鸽芷咕9 分钟前
DrissionPage 成 CANN 仓库爆款自动化工具:背后原因何在?
运维·python·自动化·cann
爱学习的阿磊11 分钟前
使用Fabric自动化你的部署流程
jvm·数据库·python
少云清31 分钟前
【金融项目实战】7_接口测试 _代码实现接口测试(重点)
python·金融项目实战
深蓝电商API31 分钟前
爬虫IP封禁后的自动切换与检测机制
爬虫·python
m0_5500246333 分钟前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
B站_计算机毕业设计之家1 小时前
豆瓣电影数据采集分析推荐系统 | Python Vue Flask框架 LSTM Echarts多技术融合开发 毕业设计源码 计算机
vue.js·python·机器学习·flask·echarts·lstm·推荐算法
渣渣苏1 小时前
Langchain实战快速入门
人工智能·python·langchain
Wei&Yan1 小时前
数据结构——顺序表(静/动态代码实现)
数据结构·c++·算法·visual studio code
lili-felicity1 小时前
CANN模型量化详解:从FP32到INT8的精度与性能平衡
人工智能·python