当前位置: 首页 > news >正文

LeetCode热题100--148. 排序链表--中等

1.题目

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

2. 题解

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode sortList(ListNode head) {//如果链表为空或者只有一个节点,无需排序if (head == null || head.next == null){return head;}// 找到中间节点head2,并断开head2与其前一个节点的连接//比如head=[4,2,1,3],那么middleNode调用结束后head=[4,2],head=[1,3]ListNode head2 = middleNode(head);//分治head = sortList(head);head2 = sortList(head2);//合并return mergeTwoLists(head,head2);}// 876. 链表的中间结点(快慢指针)private ListNode middleNode(ListNode head){ListNode pre = head;ListNode slow = head;ListNode fast = head;while( fast != null && fast.next != null){pre = slow; //记录slow的前一个节点slow = slow.next;fast = fast.next.next;}pre.next = null; //断开slow的前一个节点和slow的连接return slow;}// 21. 合并两个有序链表(双指针)private ListNode mergeTwoLists(ListNode list1,ListNode list2){ListNode dummy = new ListNode(); //用哨兵节点简化代码逻辑ListNode cur = dummy; //cur 指向新链表的末尾while(list1 != null && list2 != null){if(list1.val < list2.val){cur.next = list1; //把list1加到新链表中list1 = list1.next;} else { // 注:相等的情况加哪个节点都是可以的cur.next = list2; // 把list2加到新链表中list2 = list2.next;}cur = cur.next;}cur.next = list1 != null ? list1 : list2;  // 拼接剩余链表return dummy.next;}
}

3. 解析

出自这位老师:灵茶山艾府:两种方法:分治/迭代,模块化设计,代码可读性高(Python/Java/C++/C/Go/JS/Rust)

  1. private ListNode middleNode(ListNode head): 这个方法使用了快慢指针的方法来找出链表的中间节点。如果链表有奇数个节点,slow指针会停在最后一个节点;如果是偶数个节点,slow指针会停在第二个中间节点。为了方便后续操作(断开链表的连接),我们需要记录慢指针的前驱节点。

  2. private ListNode mergeTwoLists(ListNode list1,ListNode list2): 这个方法通过创建一个新的哨兵节点和两个输入链表一起进行比较来合并两个有序链表。它会持续地选择较小的值,并在新链表中添加。当其中一个链表耗尽时,它将自动拼接剩余的另一个链表到结果中。

  3. public ListNode sortList(ListNode head): 这个方法首先检查给定的链表是否为空或者只有一个节点(这意味着已经是有序的)。如果不是,则找到中间节点并断开连接,然后递归地对两半部分进行排序,最后将结果合并起来。

http://www.lryc.cn/news/605215.html

相关文章:

  • 限流算法详解:固定窗口、滑动窗口、令牌桶与漏桶算法全面对比
  • 力扣-543.二叉树的直径
  • 【LeetCode】链表反转实现与测试
  • (补题)小塔的饭
  • sqLite 数据库 (3):以编程方式使用 sqLite,4 个函数,以及 sqLite 移植,合并编译
  • linux 执行sh脚本,提示$‘\r‘: command not found
  • C语言:函数指针、二级指针、常量指针常量、野指针
  • 【Kubernetes 指南】基础入门——Kubernetes 201(二)
  • Vite 模块动态导入之Glob导入
  • Cursor MCP搭建入门
  • 力扣热题100---------35.搜索插入为位置
  • jQuery UI Tabs切换功能实例
  • Python在自动化与运维领域的核心角色:工具化、平台化与智能化
  • Jaeger理论、实战、问题记录
  • TikTok 视频审核模型:用逻辑回归找出特殊类型的视频
  • Elasticsearch 文档操作管理:从增删改查到批量操作与数据类型
  • 硬性巩膜镜市场报告:深度解析行业现状与未来趋势
  • Java项目:基于SSM框架实现的济南旅游网站管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
  • 同一雷达不同样式的pdw数据
  • FFmpeg:因码流采集与封装不同步导致录制出来的MP4文件会出现黑屏、绿屏的问题
  • 达梦数据库(DM Database)角色管理详解|了解DM预定义的各种角色,掌握角色创建、角色的分配和回收
  • 实现了加载 正向 碰撞 雅可比 仿真
  • 第十九周-文档数据库MongoDB、消息队列和微服务
  • I Built an Offline-Capable App by Myself: React Native Frontend, C# Backend
  • WebSocket 简介与在 Vue 中的使用指南
  • Python正则表达式精准匹配独立单词技巧
  • ACL 2025 第二弹:维也纳风情舞会点燃学术之夜
  • 论文阅读:《多目标和多目标优化的回顾与评估:方法和算法》
  • Three.js + AI:结合 Stable Diffusion 生成纹理贴图
  • 如何在 Ubuntu 24.04 或 22.04 LTS 上安装 Deepin 终端