LeetCode热题100-排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表

示例 1:

复制代码
输入:head = [4,2,1,3]
输出:[1,2,3,4]
核心思路(3 步记住)

1. 分:找中点 + 切分

  • 快慢指针:快指针走 2 步,慢指针走 1 步
  • 快指针到末尾时,慢指针就在中点
  • 断开链表,分成左右两半

2. 治:递归排序两边

递归把左右链表都变成有序链表

3. 合:合并两个有序链表

和有序链表合并题逻辑一样,用 ** 虚拟头节点(dummy)** 轻松合并

python 复制代码
class Solution:
    def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head or not head.next:
            return head
        mid = self.find_mid(head)
        right_head = mid.next
        mid.next = None
        left = self.sortList(head)
        right = self.sortList(right_head)
        return self.merge(left, right)    

    def find_mid(self, head):
        slow = head
        fast = head.next
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        return slow
    
    def merge(self, l1, l2):
        dummy = ListNode()
        cur = dummy
        while l1 and l2:
            if l1.val < l2.val:
                cur.next = l1
                l1 = l1.next
            else:
                cur.next = l2
                l2 = l2.next
            cur = cur.next
        cur.next = l1 if l1 else l2
        return dummy.next
相关推荐
无限码力22 分钟前
8.26华为OD机试真题 新系统【字符串回文判断】
算法·华为od·华为od机考·华为od机试·华为od上机考试真题·华为od最新机试真题题解·华为od机试真题题库
Tisfy2 小时前
LeetCode 1927.求和游戏:抵消+看最值
java·leetcode·游戏·题解·博弈论
玖玥拾2 小时前
LeetCode 125 验证回文串
算法·leetcode
Asize9 小时前
146. LRU 缓存
算法
Asize9 小时前
543. 二叉树的直径
算法
lemon_sjdk9 小时前
ObjectProperty
java·开发语言·算法
Zentceh10 小时前
AI-ISP在夜视机芯中的应用:从传统ISP到PixelClean全彩夜视的进化
人工智能·科技·算法·计算机视觉·车载系统·视频·智能硬件
xier_ran10 小时前
【infra之路】AWQ 详解:激活感知权重保护,让 W4A16 量化精度超越 GPTQ
线性代数·算法·机器学习·量化·infra
亦皓ai10 小时前
AI时代后端工程(二):AI把代码写得越来越快,我却越来越不敢让它直接开工了
人工智能·算法·机器学习·搜索引擎·transformer
玖玥拾12 小时前
LeetCode 392 判断子序列
笔记·算法·leetcode