100道面试必会算法-28-排序链表

100道面试必会算法-28-排序链表

链表排序是一个常见的算法问题,通常要求将一个无序的链表按照升序排列。针对这个问题,我们可以使用归并排序算法,因为归并排序在链表结构中表现出色,具有O(n log n)的时间复杂度,并且能够很好地处理链表的递归和分治特点。

问题描述

给定一个链表的头结点head,将其按升序排列并返回排序后的链表。

示例 1

输入:head = [4, 2, 1, 3]
输出:[1, 2, 3, 4]

解法思路

此题运用到三个简单题的知识进行组合,寻找链表中间节点以及两个有序链表合并,还有就是基础的递归写法的归并排序

使用归并排序算法来解决这个问题。归并排序的主要步骤包括:

  1. 分割(Divide):将链表从中间分成两半,递归地对每一半进行排序。
  2. 合并(Conquer):将两个有序链表合并成一个有序链表。
实现步骤
  1. 找到链表的中间节点:使用快慢指针法(快指针每次走两步,慢指针每次走一步)找到链表的中间节点,并将链表分成两半。
  2. 递归排序:递归地对每一半进行排序。
  3. 合并有序链表:将两个有序链表合并成一个有序链表。

代码

代码实现

class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}class Solutionp {public ListNode sortList(ListNode head) {if (head == null || head.next == null) return head;// 找到链表中间节点ListNode mid = midd(head);ListNode rightN = mid.next;mid.next = null;// 递归排序左右两半ListNode left = sortList(head);ListNode right = sortList(rightN);// 合并有序链表return mergeNode(left, right);}private ListNode mergeNode(ListNode left, ListNode right) {ListNode cur = new ListNode(-1);ListNode curr = cur;while (left != null && right != null) {if (left.val < right.val) {curr.next = left;left = left.next;} else {curr.next = right;right = right.next;}curr = curr.next;}if (left == null) {curr.next = right;} else {curr.next = left;}return cur.next;}private ListNode midd(ListNode head) {if (head == null || head.next == null) return head;ListNode slow = head;ListNode fast = head.next.next;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}public static void main(String[] args) {Solutionp solution = new Solutionp();// 创建一个无序链表ListNode head = new ListNode(3);head.next = new ListNode(2);head.next.next = new ListNode(4);head.next.next.next = new ListNode(1);// 调用sortList函数对链表进行排序ListNode sortedList = solution.sortList(head);// 打印排序后的链表while (sortedList != null) {System.out.print(sortedList.val + " ");sortedList = sortedList.next;}}
}
代码解释
  1. main方法
    • 创建一个无序链表并输出。
    • 调用sortList方法对链表进行排序。
    • 打印排序后的链表。
  2. sortList方法
    • 基本情况:如果链表为空或只有一个元素,直接返回。
    • 找到链表的中间节点并分割链表。
    • 递归地对左右两半进行排序。
    • 合并排序后的链表。
  3. mergeNode方法
    • 创建一个虚拟头结点,使用两个指针逐步合并两个有序链表。
    • 返回合并后的链表。
  4. midd方法
    • 使用快慢指针法找到链表的中间节点。
    • 快指针每次走两步,慢指针每次走一步,当快指针到达链表末尾时,慢指针正好到达中间节点。
总结

通过上述步骤和代码,实现了对链表的归并排序。这种方法不仅效率高,而且能够很好地处理链表结构中的排序问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能(AI)的发展:从过去到未来的演进

人工智能&#xff08;AI&#xff09;作为当今科技领域的热门话题&#xff0c;其发展历程、当前应用以及未来趋势都备受关注。从最初的简单计算到如今的深度学习、自然语言处理&#xff0c;AI技术已经取得了巨大的进步&#xff0c;并正在逐渐改变我们的世界。本文将回顾AI的发展…

vs2019 QT UI 添加新成员或者控件代码不提示问题解决方法

右键点击头文件&#xff0c;添加ui的头文件 添加现有项 找到uic目录的头文件 打开ui,QtWidgetsApplication2.ui,进行测试 修改一个名字&#xff1a; 重点&#xff1a; 设置一个布局&#xff1a; 点击生成解决方案&#xff1a; 以后每次添加控件后&#xff0c;记得点击保存 这样…

flink 作业报日志类冲突的解决方案

文章目录 背景思考初步解决方案深入思考下终极解决方案总结 背景 实时作业在页面提交任务后&#xff0c;报NoSuchMethodException 方法&#xff0c;看了下是关于log4j的&#xff0c;首先是作业升级了很多依赖的版本&#xff0c;其次flink 也升级 到了1.19版本 思考 打的Jar有…

C#实现winform中渲染图的展示

在WinForms中实现图形的渲染展示&#xff0c;可以使用GDI绘图技术。下面是一个简单的示例&#xff0c;演示如何在WinForms中展示一个圆形图形&#xff0c;并根据用户输入的半径动态改变圆的大小&#xff1a; 请在Visual Studio中创建一个WinForms应用程序&#xff0c;并将以下…

c# 笔记 多个checkbox 点击其一个设置为选择状态 其他则为非选择状态 c# WndProc方法 base.WndProc(ref m);

多个checkbox 点击其一个设置为选择状态 其他则为非选择状态 在一个 CheckBox 被选中时将其他 CheckBox 设置为未选中状态。这可以通过循环遍历 CheckBox 控件并根据当前选中的 CheckBox 来设置其状态来实现。 下面是一个示例代码&#xff0c;展示了如何实现这个功能&#xf…

Java 基础面试300题 (171- 200)

Java 基础面试300题 &#xff08;171- 200&#xff09; 171.什么是同步&#xff1f; 当多个线程试图同时访问共享资源时&#xff0c;那么他们需要以某种方式让资源一次只能由一个线程访问。实现这一目标的过程被称为同步。Java提供了一个名为synchronized的关键字实现这一目标…

CSS选择器的常见用法

大家好&#xff0c;本期博客整理了前端语言 CSS 中选择器的入门级常见用法&#xff0c;希望能对大家有所帮助 CSS 选择器的主要功能就是选中⻚⾯指定的标签元素&#xff0c;选中了元素&#xff0c;才可以设置元素的属性。 那么&#xff0c;css选择器有哪几种呢&#xff1f; 以…

全面理解渗透测试

揭秘网络安全的秘密武器&#xff1a;全面理解渗透测试 在数字化时代&#xff0c;网络安全已成为人们关注的焦点。网络攻击和数据泄露事件频发&#xff0c;给个人、企业和国家带来了巨大的损失。为了应对这一挑战&#xff0c;渗透测试作为一种重要的网络安全评估手段&#xff0…

Docker-----emqx部署

emqx通过Docker容器化部署流程 1.创建持久化挂载目录 mkdir -p /home/emqx/etc ------挂载emqx的配置文件目录 mkdir -p /home/emqx/data ------挂载emqx的存储目录 mkdir -p /home/emqx/log ------挂载emqx的日志目录 [root home]# mkdir -p /home/emqx/etc [root home]# mkd…

【Redis】 使用Java操作Redis的客户端

文章目录 &#x1f343;前言&#x1f334;项目的创建&#x1f38b;引入依赖&#x1f333;配置端⼝转发&#x1f332;更改 Redis 配置文件&#x1f384;连接 Redis Server⭕总结 &#x1f343;前言 我们使用 Java 操作 Redis 客户端时我们需要进行以下操作。 注意&#xff1a;J…

Wormhole勒索病毒的最新威胁:如何恢复您的数据?

导言 随着互联网的飞速发展&#xff0c;网络安全问题愈发凸显其重要性。近年来&#xff0c;勒索病毒成为了网络安全领域的一大威胁&#xff0c;其中.Wormhole勒索病毒因其独特的传播方式和强大的破坏性&#xff0c;引起了全球范围内的广泛关注。本文91数据恢复旨在深入探讨.Wo…

Linux上部署和安装MinIO

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法&#xff0c;大数据&#xff0c;深度学习 &#x1f492; 公众号…

架构师如何以打游戏的心态做开发?

为什么打游戏可以很好玩&#xff0c;能够自发学习&#xff0c;从青铜到黄金很简单。换个角度思考&#x1f914;&#xff0c;以打游戏的心态如何进行架构开发&#xff0c;可以采用以下策略&#xff1a; 设定目标和里程碑&#xff1a; 就像游戏中的任务和关卡一样&#xff0c;为…

2024年6月1日 (周六) 叶子游戏新闻

Embracer探讨单机游戏大作涨价超过70美元的可能性在Embracer集团等待公布新公司名称的同时&#xff0c;他们对游戏大作的价格上涨做出了评论。几年来&#xff0c;游戏大作的价格已经达到了70美元的门槛。Embracer集团的CEO Lars Wingefors在采访中表示&#xff0c;电子游戏行业…

vulnhub靶场之FunBox-10

一.环境搭建 1.靶场描述 As always, its a very easy box for beginners. This works better on VitualBox rather than VMware 2.靶场下载 Funbox: Under Construction! ~ VulnHub 3.靶场启动 靶场IP地址我们不知道&#xff0c;但是网段我们知道是192.168.2.0/24 二.信息…

stack学习

std::stack 类是一种容器适配器&#xff0c;它给予程序员栈的功能——特别是 FILO&#xff08;先进后出&#xff09;数据结构。该类模板用处为底层容器的包装器——只提供特定函数集合。栈从被称作栈顶的容器尾部推弹元素。 operator 赋值给容器适配器 (公开成员函数) 元素访问…

Base64码转换

title: Base64码转换 date: 2024-06-01 20:30:28 tags: vue3 后端图片前端显示乱码 现象 后端传来一个图片&#xff0c;前端能够接收&#xff0c;但是console.log()后发现图片变成了乱码&#xff0c;但是检查后台又发现能够正常的收到了这张图片。 处理方法 笔者有尝试将图…

Java关键字详解

文章目录 什么是关键字&#xff1f;数据类型&#xff08;10个&#xff09;byte、char、boolean、short、int、float、long、double、void、enum 流程控制&#xff08;12个&#xff09;if、else、do、while、for 、switch、case、assertbreak&#xff08;跳出循环&#xff09;co…

Orchestrator 记录

Orchestrator 安装 Orchestrator cd /usr/local/orchestrator nohup ./orchestrator --configorchestrator.conf.json http >> orchestrator.log 2>&1 & tailf orchestrator.log访问 http://10.XX.36.216:30000实例管理命令 discover forget begin-maintena…

STM32(八):独立看门狗 (标准库函数)

前言 上一篇文章介绍了STM32单片机中的USART串口通信&#xff0c;这篇文章我们来介绍一下如何用STM32单片机中的独立看门狗来实现检测按键点灯的程序。 一、实验原理 单片机系统会由于受到外界的干扰&#xff0c;而造成程序执行紊乱&#xff0c;系统无法正常运行。为了防止这…