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

力扣面试150题--排序链表

Day 76

题目描述

在这里插入图片描述

思路

初次思路:题目进阶要求O(nlogn)的时间复杂度,但这类排序算法对于链表难以实现,所以我先选择了使用选择排序入手,具体做法如下:

  1. 使用快慢指针遍历链表,beg指针记录已排序的位置,min和bemin记录这一轮最小节点及其前一个节点
  2. 如果beg的下一个不是空,说明没有遍历完所有链表
  3. 使用快慢指针顺序遍历,比较fast指向值和min比较,比它小记录fast和slow指针
  4. 遍历一轮结束后,进行交换即可
/**1. Definition for singly-linked list.2. public class ListNode {3.     int val;4.     ListNode next;5.     ListNode() {}6.     ListNode(int val) { this.val = val; }7.     ListNode(int val, ListNode next) { this.val = val; this.next = next; }8. }*/
class Solution {public ListNode sortList(ListNode head) {if(head==null){return head;}ListNode m=new ListNode();m.next=head;ListNode beg=m;ListNode slow=m;//慢指针ListNode fast=m.next;//快指针ListNode min=m.next;ListNode bemin=m;while(beg.next!=null){int mins=50001;while(fast!=null){if(fast.val<mins){mins=fast.val;min=fast;bemin=slow;}slow=slow.next;fast=fast.next;}//取到这一轮最小的值了bemin.next=min.next;min.next=beg.next;beg.next=min;beg=beg.next;slow=beg;fast=slow.next;}return m.next;}}

可惜超时了
在这里插入图片描述
分析一下,还是选择排序太慢了 O(n方),所以还是得从那几个O(nlogn)的算法入手
优化思路:我们可以采取归并排序的方式来解决这个问题

  1. 将链表不断分为左右两段,分离的函数为 getMiddle(ListNode head),做法不赘述了,前面的题目实现过。
  2. 最后链表会分为一段只有一个数字(分割的最终阶段)
  3. 开始合并,合并算法是归并算法(前面也做过)
  4. 最后合并成一个有序链表
/*** 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;}// 找到中间节点并分割链表ListNode mid = getMiddle(head);ListNode rightHead = mid.next;mid.next = null; // 断开左右链表// 递归排序左右两部分ListNode left = sortList(head);ListNode right = sortList(rightHead);// 合并有序链表return merge(left, right);}// 使用快慢指针找到链表的中间节点private ListNode getMiddle(ListNode head) {if (head == null) return null;ListNode slow = head;ListNode fast = head.next;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}// 合并两个有序链表private ListNode merge(ListNode l1, ListNode l2) {if (l1 == null) return l2;if (l2 == null) return l1;ListNode dummy = new ListNode(0);ListNode tail = dummy;while (l1 != null && l2 != null) {if (l1.val < l2.val) {tail.next = l1;l1 = l1.next;} else {tail.next = l2;l2 = l2.next;}tail = tail.next;}// 处理剩余节点if (l1 != null) tail.next = l1;if (l2 != null) tail.next = l2;return dummy.next;}
}

文章转载自:
http://bumiputraization.bdypl.cn
http://benedict.bdypl.cn
http://cardamine.bdypl.cn
http://cartop.bdypl.cn
http://antihydrogen.bdypl.cn
http://broiler.bdypl.cn
http://beau.bdypl.cn
http://approach.bdypl.cn
http://catabolize.bdypl.cn
http://aria.bdypl.cn
http://antiozonant.bdypl.cn
http://ardency.bdypl.cn
http://adulterate.bdypl.cn
http://bento.bdypl.cn
http://antibilious.bdypl.cn
http://biogasification.bdypl.cn
http://antitussive.bdypl.cn
http://amidst.bdypl.cn
http://abhor.bdypl.cn
http://afreet.bdypl.cn
http://cephalic.bdypl.cn
http://cavalryman.bdypl.cn
http://apoenzyme.bdypl.cn
http://biomembrane.bdypl.cn
http://autobiographer.bdypl.cn
http://certificate.bdypl.cn
http://adagissimo.bdypl.cn
http://acnode.bdypl.cn
http://chaser.bdypl.cn
http://billingsgate.bdypl.cn
http://www.dtcms.com/a/280868.html

相关文章:

  • WebApplicationType.REACTIVE 的webSocket 多实例问题处理
  • MySQL数据库----约束
  • C# 构建动态查询表达式(含查询、排序、分页)
  • C语言基础第6天:分支循环
  • Ubuntu24 辅助系统-屏幕键盘的back按键在网页文本框删除不正常的问题解决方法
  • CentOS7 Docker安装MySQL全过程,包括配置远程连接账户
  • fastApi连接数据库
  • 如何正确分配及设置香港站群服务器IP?
  • 深入解析 Java AQS (AbstractQueuedSynchronizer) 的实现原理
  • LeetCode 3136.有效单词:遍历模拟
  • [实战] 基8 FFT/IFFT算法原理与实现(完整C代码)
  • 【每天一个知识点】多模态信息(Multimodal Information)
  • 【知识扫盲】tokenizer.json中的vocab和merges是什么?
  • 【机器学习】第二章 Python入门
  • 【Unity】MiniGame编辑器小游戏(十四)基础支持模块(游戏窗口、游戏对象、物理系统、动画系统、射线检测)
  • 数学中的教学思想
  • MySQL 8.0 OCP 1Z0-908 题目解析(24)
  • P3842 [TJOI2007] 线段
  • Sharding-JDBC 分布式事务实战指南:XA/Seata 方案解析
  • sqli-labs靶场通关笔记:第18-19关 HTTP头部注入
  • 【C++】初识C++(1)
  • 课题学习笔记1——文本问答与信息抽取关键技术研究论文阅读(用于无结构化文本问答的文本生成技术)
  • Java 大视界 -- Java 大数据机器学习模型在金融风险传染路径分析与防控策略制定中的应用(347)
  • QT——QList的详细讲解
  • Redis的下载安装+基础操作+redis客户端的安装
  • 使用 1Panel PHP 运行环境部署 WordPress
  • 辨析git reset三种模式以及和git revert的区别:回退到指定版本和撤销指定版本的操作
  • 零样本轴承故障诊断SC - GAN模型
  • 【PCIe 总线及设备入门学习专栏 5.1.2 -- PCIe EP core_rst_n 与 app_rst_n】
  • React-router