【数据结构与算法 | 灵神题单 | 插入链表篇】力扣2807, LCR 029, 147
1. 力扣2807:在链表中插入最大公约数
1.1 题目:
你一个链表的头 head
,每个结点包含一个整数值。
在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。
请你返回插入之后的链表。
两个数的 最大公约数 是可以被两个数字整除的最大正整数。
示例 1:
输入:head = [18,6,10,3] 输出:[18,6,6,2,10,1,3] 解释:第一幅图是一开始的链表,第二幅图是插入新结点后的图(蓝色结点为新插入结点)。 - 18 和 6 的最大公约数为 6 ,插入第一和第二个结点之间。 - 6 和 10 的最大公约数为 2 ,插入第二和第三个结点之间。 - 10 和 3 的最大公约数为 1 ,插入第三和第四个结点之间。 所有相邻结点之间都插入完毕,返回链表。
示例 2:
输入:head = [7] 输出:[7] 解释:第一幅图是一开始的链表,第二幅图是插入新结点后的图(蓝色结点为新插入结点)。 没有相邻结点,所以返回初始链表。
提示:
- 链表中结点数目在
[1, 5000]
之间。 1 <= Node.val <= 1000
1.2 思路
这题的难点在于如果求两个相邻节点的最大公约数。如果两个值中的最大值可以与最小值整除,那么最小值就是最大公约数,否则我们用更相减损术(夸克搜的)。
1.3 题解:
/*** 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 insertGreatestCommonDivisors(ListNode head) {if(head == null || head.next == null){return head;}ListNode dummy = new ListNode(10086, head);ListNode cur = dummy;// 用来求最大公约数while(cur.next != null && cur.next.next != null){int a = cur.next.val;int b = cur.next.next.val;int max = Integer.max(a, b);int min = Integer.min(a, b);// 如果可以整除,最小值就是最大公约数if(max % min == 0){} else {// 更相减损术int sub = max - min;while(sub != min){max = Integer.max(sub, min);min = Integer.min(sub, min);sub = max - min;}}ListNode p = new ListNode(min, cur.next.next);cur.next.next = p;// 这里是p的原因在于:我们要处理的是cur的下一个节点和下下一个节点// 而p此时位于的节点刚好在要处理的两个节点前面cur = p;}return dummy.next;}
}
2. 力扣LCR:029:循环有序列表的插入
2.1 题目:
给定循环单调非递减列表中的一个点,写一个函数向这个列表中插入一个新元素 insertVal
,使这个列表仍然是循环升序的。
给定的可以是这个列表中任意一个顶点的指针,并不一定是这个列表中最小元素的指针。
如果有多个满足条件的插入位置,可以选择任意一个位置插入新的值,插入后整个列表仍然保持有序。
如果列表为空(给定的节点是 null
),需要创建一个循环有序列表并返回这个节点。否则。请返回原先给定的节点。
示例 1:
输入:head = [3,4,1], insertVal = 2
输出:[3,4,1,2]
解释:在上图中,有一个包含三个元素的循环有序列表,你获得值为 3 的节点的指针,我们需要向表中插入元素 2 。新插入的节点应该在 1 和 3 之间,插入之后,整个列表如上图所示,最后返回节点 3 。
示例 2:
输入:head = [], insertVal = 1
输出:[1]
解释:列表为空(给定的节点是 null
),创建一个循环有序列表并返回这个节点。
示例 3:
输入:head = [1], insertVal = 0
输出:[1,0]
提示
0 <= Number of Nodes <= 5 * 10^4
-10^6 <= Node.val <= 10^6
-10^6 <= insertVal <= 10^6
2.2 思路:
先遍历链表找到链表中最新的最大值节点,该节点的next节点即该链表的最小值节点(可能会有很多个最小值节点,但该最小值节点是边界)。
从最小值节点开始遍历,碰到合适的位置就可以插入,然后返回head即可。如果直到遍历完链表,仍然找不到位置插入,该需要插入节点的值比整个链表的值都要大或都要小,则需要插入到最小值节点的后面,这个时候我们就可以想到找到该最小值节点的上一个节点,parent节点跟踪最小值节点min_point。然后处理parent节点和要插入节点的关系即可。
2.3 题解:
/*
// Definition for a Node.
class Node {public int val;public Node next;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, Node _next) {val = _val;next = _next;}
};
*/class Solution {public Node insert(Node head, int insertVal) {Node insert = new Node(insertVal);// 如果链表为空,需要特殊判断if(head == null){insert.next = insert;return insert;}// 遍历链表找到最小值节点// 发现最新的最大值的后面就是最小值// 因为最大值可能有很多个,我们要最新的,所以p.val >= max有等于号int max = head.val;Node max_point = head;Node p = head.next;// n表示链表的长度int n = 1;while(p != head){if(p.val >= max){max = p.val;max_point = p;}n++;p = p.next;}// max_point指向了最大值的节点Node min_point = max_point.next;Node parent = null;while(n-- > 0){// 找到合适的地方就插入if(min_point.val <= insertVal && insertVal <= min_point.next.val){insert.next = min_point.next;min_point.next = insert;return head;}parent = min_point;min_point = min_point.next;}// 还没插入成功,插到最小值后面insert.next = parent.next;parent.next = insert;return head;}
}
3. 力扣147:对链表进行插入排序
3.1 题目:
给定单个链表的头 head
,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。
插入排序 算法的步骤:
- 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
- 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
- 重复直到所有输入数据插入完为止。
下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。
对链表进行插入排序。
示例 1:
输入: head = [4,2,1,3] 输出: [1,2,3,4]
示例 2:
输入: head = [-1,5,3,4,0] 输出: [-1,0,3,4,5]
提示:
- 列表中的节点数在
[1, 5000]
范围内 -5000 <= Node.val <= 5000
3.2 思路:
由于个人实力太菜,写着一跑就超时了,无奈转换成求解数组的插入排序。
3.3 题解
/*** 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 insertionSortList(ListNode head) {// 特殊情况直接返回if(head == null || head.next == null) {return head;}ListNode node = head;int n = 0;while(node != null){n++;node = node.next;}int[] arr = new int[n];node = head;n = 0;while(node != null){arr[n++] = node.val;node = node.next;}for(int i = 1; i < arr.length; i++){int t = arr[i];int j = i - 1;while(j >= 0 && t < arr[j]){arr[j+1] = arr[j];j--;}if(j != i - 1){arr[j+1] = t;}}node = head;int k = 0;while(node != null){node.val = arr[k++];node = node.next;}return head;}
}
相关文章:

【数据结构与算法 | 灵神题单 | 插入链表篇】力扣2807, LCR 029, 147
1. 力扣2807:在链表中插入最大公约数 1.1 题目: 你一个链表的头 head ,每个结点包含一个整数值。 在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。 请你返回插入之后的链表。 两个…...

瑞芯微rv1126 Linux 系统,修改系统时区,包有效方法
在 Linux 系统中,修改时区的步骤通常包括创建符号链接到正确的时区文件,并确保相关的配置文件已正确更新。然而,某些系统可能有额外的步骤或需要修改其他配置文件来使更改生效。以下是一些步骤。 1. 创建符号链接 ln -sf /usr/share/zoneinfo/Asia/Hong_Kong /etc/localti…...

系统架构设计师:数据库设计
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师:数据库设计前言数据库基础概念数据模型三要素数据库的三级模型和两级…...

代码随想录刷题day31丨56. 合并区间,738.单调递增的数字,总结
代码随想录刷题day31丨56. 合并区间,738.单调递增的数字,总结 1.题目 1.1合并区间 题目链接:56. 合并区间 - 力扣(LeetCode) 视频讲解:贪心算法,合并区间有细节!LeetCode&#x…...

深圳建站公司-如何做网站
深圳建站公司:如何制作一个成功的网站 在信息化快速发展的今天,企业和个人越来越重视网络形象,网站成为了展示品牌、推广产品和服务的重要平台。深圳作为科技创新和经济发展的前沿城市,涌现出许多专业的建站公司,能够为…...

Google Earth Engine(GEE)——随时间推移的降雨趋势案例分析(大规模气候监测)
简介 探索 Google Earth Engine环境类型中不同的数据。到目前为止,我们主要使用光学卫星数据,并探索了植被随时间和空间的趋势。然而,仅仅跟踪植被特性的变化并不足以了解是什么驱动了它们——我们需要能够将这些动态与其他环境数据联系起来。 在交互式 GEE 控制台中为您感…...

从新手到高手:用这9个策略让ChatGPT成为你的私人顾问!
ChatGPT已经出来快一年多了,但是我发现周围的小伙伴还是处在调戏ChatGPT的阶段,并没有在日常工作和生活中发挥他应由的价值。我调研下来发现最关键的痛点就是:不知道该怎么写Prompt可以让ChatGPT输出期望的回答。 哎吆,这不正是撞…...

高精度定位系统中的关键技术:GGA、EHP、RTMC、IMU、GNSS、INS 和 RTK 的协同工作
文章目录 0. 概述1. GGA:标准的定位数据格式2. EHP:增强高度精度3. RTMC:实时监控与控制4. IMU 和 INS:惯性测量和导航系统5. GNSS:全球导航卫星系统6. RTK:实时动态差分定位7. 各技术的融合与协同GPS 数据…...

Spring3~~~
目录 多例 后置处理器BeanPostProcessor XML配置 通过注解 AOP与后置处理器 JdbcTemplate jdbc.properties jdbc.xml Test 具名参数 DAO 声明式事务 GoodsDao GoodsService xml 传播机制 种类 隔离级别 超时回滚 如果是普通的java项目,xml文件放…...

微服务CI/CD实践(五)Jenkins Docker 自动化构建部署Java微服务
微服务CI/CD实践系列: 微服务CI/CD实践(一)环境准备及虚拟机创建 微服务CI/CD实践(二)服务器先决准备 微服务CI/CD实践(三)Jenkins部署及环境配置 微服务CI/CD实践(四)…...

泰州高新区法院多层面强化固定资产管理
固定资产管理是法院的一项基础性工作,法院经费支出相当一部分用于固定资产的购置,为了提高固定资产使用质效,为执法办案提供坚实的保障,高新区法院积极探索科学合理的固定资产管理策略,更新管理思想,完善管…...

JDBC简介与应用:Java数据库连接的核心概念和技术
简短介绍 JDBC 及其重要性。 简短介绍 JDBC JDBC(Java Database Connectivity)是一种用于执行 SQL 语句的 Java API 并且独立于特定的数据库厂商。它允许开发者以一种标准的方式从 Java 应用程序中访问关系型数据库,这意味着一旦你掌握了 J…...

倒反天罡!这个AI风格模型可自由训练,还能批量生成同风格图像
在AIGC的新纪元中,模型已晋升为与算力并驾齐驱的生产力核心要素。也有不少用户反馈提到,如何利用神采PromeAI训练属于自己的风格模型?这需求必须安排!神采PromeAI「一致性模型」正式上线! 可自主训练风格化模型&#x…...

Stable Diffusion绘画 | ControlNet应用-Inpaint(局部重绘):更完美的重绘
Inpaint(局部重绘) 相当于小号的AI版PS,不但可以进行局部画面的修改,还可以去除背景中多余的内容,或者是四周画面内容的扩充。 预处理器说明 Inpaint_Global_Harmonious:重绘-全局融合算法,会对整个图片的画面和色调…...

电网谐波越限怎么处理
当电网中的谐波超出限值时,需要采取有效措施来处理和减少谐波,以保护电力系统的设备,确保电力质量。以下是处理电网谐波越限的主要措施: 1、谐波分析 监测与检测:使用谐波分析仪或功率质量分析仪监测谐波含量&#x…...

Redis中的AOF重写过程及其实际应用
引言 在Redis中,持久化是确保数据安全和稳定运行的关键部分。Redis提供了两种持久化方式:RDB快照和AOF(Append Only File)日志。相比RDB快照,AOF能够更频繁地保存数据变更,并且在服务器崩溃后能够更快地恢…...

JVM面试
1 黑马 1.1 什么是JVM 定义:JVM 就是java虚拟机,是运行在系统中的应用程序。它运行java的字节码文件,除了java还支持其他语言。作用:它主要作用就是实现java的代码一次编码,到处运行。实现java代码的跨平台性。功能&…...

【模板的特殊继承关系】 奇异的递归模板模式
一、奇异的递归模板模式范例 奇异的递归模板模式 ( C u r i o u s l y R e c u r r i n g T e m p l a t e P a t t e r n ) (Curiously \ Recurring \ Template \ Pattern) (Curiously Recurring Template Pattern)不是一种新技术,而是一种模板编程中使用的编程手…...

SAP B1 单据页面自定义 - 用户界面编辑字段
背景 接《SAP B1 基础实操 - 用户定义字段 (UDF)》,在设置完自定义字段后,如下图,通过打开【用户定义字段】可打开表单右侧的自定义字段页。然而再开打一页附加页面操作繁复,若是客户常用的定义字段,也可以把这些用户…...

MinIO【部署 02】Linux集群版本及Windows单机版、单机多目录版、分布式版(cmd启动脚本及winsw脚本分享)
Linux集群版及Windows单机版分布式版 1.Linux集群版1.1 安装启动停止1.2 将MinIO添加到服务 2.Windows2.1 官网安装2.2 本地测试2.2.1 cmd启动脚本2.2.2 winsw脚本 3.总结 1.Linux集群版 官网下载地址 https://min.io/download#/linux; 官网安装文档 https://min.i…...

手握18个大厂offer,我在大模型风口起飞
前言 在“金三银四”这一招聘旺季中,社交媒体上满是分享 offer 信息的“求助帖”。这些帖子通常只公布公司名称与薪资区间,而将具体岗位模糊化,以此作为判断岗位是否值得入职的衡量标准。 2024 年毕业的 985 硕士白丁(化名&…...

邦芒忠告:办公室聊天应避开的四个话题
职场人生风云变幻,害人之心不可有,防人之心不可无。千万别把同事当知己,无话不谈,把自己的私域圈起来当成办公室话题的禁区,轻易不让人涉足,其实是非常明智的一招,是竞争压力下的自我保护。 话题…...

交易型开放式指数基金(ETF)
交易型开放式指数基金(Exchange Traded Fund,简称 ETF)是一种投资工具,以下是用通俗易懂的语言对其进行的讲解: 一、基本概念 想象 ETF 是一个大篮子,里面装着很多不同的东西。在金融市场里,这…...

opencv将灰度图转为彩色图片
文章目录 背景灰度图优势opencv读取灰度图彩色转灰度算法需求 方法测试代码 背景 在图像处理中通常需要将图片转为灰度图 灰度图,也称为灰度图像或黑白图像,是一种只包含亮度信息而不包含颜色信息的图像。在灰度图中,每个像素的亮度级别通常…...

判断PDF与图片是否可以预览
一、判断图片是否可以预览 在JavaScript中,可以使用Image对象来判断一个图片URL是否可以访问。如果图片可以被加载,那么load事件会被触发;如果图片无法访问,error事件会被触发。 function checkImageAccessibility(url, callbac…...

多线程与并发区别
在Java中,多线程与并发是两个既相关又有所区别的概念。我们可以这样来理解它们: 多线程(Multi-threading): 多线程是指程序能够同时执行多个线程。每个线程都是一个独立的执行流,它们共享程序的内存空间&a…...

这个桌面日历真不错 笔记 提醒 生日记录 打卡 翻译都有 真的太方便了!
这个桌面日历真不错 笔记 提醒 生日记录 打卡 翻译都有 真的太方便了!日历产品非常的多,如何选择一个合适自己的桌面日历,这个很重要,今天小编给大家介绍这个芝麻日历,一起看下它有些什么功能,是不是你需要…...

多模态大语言模型综述(中)-算法实用指南
本文是Multimodal Large Language Models: A Survey的译文之算法实用指南部分。 上:摘要、概念与技术要点实用指南中:算法实用指南(本文)下: 任务的实用指南(应用)、挑战等 原始信息 标题: Multimodal Large Language Models: A Survey译文: 多模态大…...

Qt | ubuntu20.04安装Qt6.5.3并创建一个example完整教程(涉及诸多开发细节,商用慎重)
点击上方"蓝字"关注我们 01、下载 >>> 下载Qt在线安装包 这里采用镜像地址进行下载,避免网络过慢。 镜像地址:http://mirrors.ustc.edu.cn/qtproject/archive/online_installers/4.5/ 选择最新版本下载,如截至目前最新版本为qt-unified-linux-x64-4.5.2…...

苏州科技大学、和数联合获得国家知识产权局颁发的3项发明专利证书
近日,基于“苏州科技大学-和数智能软件区块链技术工程实验室”的研究成果,国家知识产权局正式授权了苏州科技大学、苏州和数区块链应用研究院联合申报的3项发明专利证书。 分别为: 一种基于双账本的物联网数据存储与共享方法 一种面向物联网…...