算法练习--leetcode 链表
文章目录
- 合并两个有序链表
- 删除排序链表中的重复元素 1
- 删除排序链表中的重复元素 2
- 环形链表1
- 环形链表2
- 相交链表
- 反转链表
合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。
新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:

输入: l 1 {l1} l1 = [1,2,4], l 2 {l2 } l2= [1,3,4]
输出:[1,1,2,3,4,4] 以列表 表示每个节点的value
示例 2:
输入: l 1 {l1} l1 = [], l 2 {l2} l2 = []
输出:[] 表示没有节点 None
示例 3:
输入:l1 = [], l2 = [0]
输出:[0] 表示有一个value为0的节点
提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 升序排列
python实现:双指针
# Definition for singly-linked list.
# class ListNode: # 预定义好的 直接用就行
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: # ListNode or Noneif not list1 and not list2:return None # [] 代表空节点elif not list1 or not list2:return list1 if list1 else list2# header = Nonep = Nonewhile list1 and list2:if list1.val <= list2.val:if header is None:header = list1p = list1else:p.next = list1p = list1list1 = list1.nextelse:if header is None:header = list2p = list2else:p.next = list2p = list2list2 = list2.nextif list1:p.next = list1elif list2:p.next = list2return header
java实现:
删除排序链表中的重复元素 1
给定一个已排序的链表的头 head , 删除重复的后继元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:

输入:head = [1,1,2]
输出:[1,2]
示例 2:

输入:head = [1,1,2,3,3]
输出:[1,2,3]
python实现:递归算法
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:if head is None or head.next is None:return head# 至少两个节点cur = headif cur.val == cur.next.val:cur.next = cur.next.nextreturn self.deleteDuplicates(head)else:cur.next = self.deleteDuplicates(cur.next)return head
java实现:

删除排序链表中的重复元素 2
给一个已排序的链表的头 head , 删除原始链表中所有 重复数字的节点 ,返回该链表 。
重点:已排序
示例 1:

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

输入:head = [1,1,1,2,3]
输出:[2,3]
python实现: 递归解决
- 情况1:删除头节点重复的部分,继续递归处理剩下的部分;
- 情况2:保留头节点,继续处理剩下的部分
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:if head is None or head.next is None:return head# 至少两个节点cur = headif cur.val == cur.next.val: # 要删除头节点move = cur.next.nextwhile move and cur.val == move.val: # 移动到不相等的节点move = move.nextreturn self.deleteDuplicates(move)else:cur.next = self.deleteDuplicates(cur.next) # 保留头节点return head
同一段程序,多次提交,耗时和击败用户比率会不同;所以不用在乎这个击败比率。

java实现:
pending
环形链表1
给一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。存在环 ,则返回 true 。 否则,返回 false 。
以下pos不作为参数
示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
进阶:你能用 O(1) 空间复杂度解决此问题吗?
python实现:
# 辅助空间 + 循环
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:temp = []cur = headwhile cur:temp.append(cur)if cur.next in temp: # python内置方法也慢return Truecur = cur.nextreturn False# 双指针 一快 一慢 空间复杂度O(1)
# 快走两步 慢走一步 会在环内相遇
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:def hasCycle(self, head: Optional[ListNode]) -> bool:if head is None:return Falseslow_ptr = head # 一次走一步fast_ptr = head # 一次走两步while fast_ptr.next and fast_ptr.next.next:slow_ptr = slow_ptr.nextfast_ptr = fast_ptr.next.nextif fast_ptr is slow_ptr:return Truereturn False
java双指针

环形链表2
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
pos不传参,且不允许修改链表
示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
示例 2:

输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
示例 3:

输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。
python实现:
# 辅助空间 + 循环
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:if head is None:return Nonetemp = []cur = headwhile cur:temp.append(cur)if cur.next in temp:return cur.nextcur = cur.nextreturn None# 双指针 一快一慢 空间复杂度O(1)
# 快指针移动2步
# 漫指针移动1步
# 在环中相遇后,慢指针重置到head指针
# 然后两个指针均移动一步,直到再次相遇,即找到入环的节点
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:if head is None:return Noneslow_ptr = headfast_ptr = headhas_circle = Falsewhile fast_ptr.next and fast_ptr.next.next:slow_ptr = slow_ptr.nextfast_ptr = fast_ptr.next.nextif fast_ptr is slow_ptr:has_circle = Truebreakif has_circle:# 重置慢指针为headslow_ptr = head# 两个指针均移动一步,直到相遇while slow_ptr is not fast_ptr:slow_ptr = slow_ptr.nextfast_ptr = fast_ptr.next# 相遇则为入环节点return fast_ptrreturn None
优化前后时间对比:

java实现:

相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
你能否设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案?
m,n 分别为链表A B的节点数。
图示两个链表在节点 c1 开始相交:

示例 1:

输入:listA = [4,1,8,4,5], listB = [5,6,1,8,4,5]
skipA = 2, skipB = 3 intersectVal = 8,
输出:node 8 对象
示例 2:

输入:listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1 intersectVal = 2,
输出:node 2
示例 3:

输入:listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2 intersectVal = 0,
输出:null
python 实现:
双指针 循环移动 直至相遇
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = Noneclass Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:if headA is None or headB is None:return Nonepa = headApb = headBwhile pa is not pb:pa = pa.next if pa else headBpb = pb.next if pb else headAreturn pa
也可以计算链表的长度差值,较长的链表指针移动长度差个步子。
反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:

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

输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
python实现:
在这里插入代码片
java实现:

相关文章:
算法练习--leetcode 链表
文章目录 合并两个有序链表删除排序链表中的重复元素 1删除排序链表中的重复元素 2环形链表1环形链表2相交链表反转链表 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入&…...
Android性能优化—Apk瘦身优化
随着业务迭代,apk体积逐渐变大。项目中积累的无用资源,未压缩的图片资源等,都为apk带来了不必要的体积 增加。而APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。在讨论如何缩减应用的大小之前,有必要了解下应用 APK …...
前端主题切换方案——CSS变量
前言 主题切换是前端开发中老生常谈的问题,本文将介绍主流的前端主题切换实现方案——CSS变量 CSS变量 简介 编写CSS样式时,为了避免代码冗余,降低维护成本,一些CSS预编译工具(Sass/Less/Stylus)等都支…...
Java8 list多属性去重
大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 在 Java 开发中,我们经常会面临对 List 中的对象属性去重的需求。然而,当需要根据多个属性来进行去重时,情况会稍微复杂一些。本篇…...
kafka-保证数据不重复-生产者开启幂等性和事务的作用?
1. 生产者开启幂等性为什么能去重? 1.1 场景 适用于消息在写入到服务器日志后,由于网络故障,生产者没有及时收到服务端的ACK消息,生产者误以为消息没有持久化到服务端,导致生产者重复发送该消息,造成了消…...
[AI in security]-214 网络安全威胁情报的建设
文章目录 1.什么是威胁情报2. 威胁情报3. 智能威胁情报3.1 智能威胁情报的组成3.2 整合威胁情报3.3 最佳实践4. 威胁情报的作用5.威胁情报模型6.反杀链模型7.基于TI的局部优势模型参考文献相关的研究1.什么是威胁情报 威胁情报是循证知识,包括环境、机制、指标、意义和可行性…...
Javaweb学习(2)
Javaweb学习 一、Maven1.1 Maven概述1.2 Maven简介1.3、Maven基本使用1.4、IDEA配置Maven1.6、依赖管理&依赖范围 二、MyBatis2.1 MyBatis简介2.2 Mybatis快速入门2.3、解决SQL映射文件的警告提示2.4、Mapper代理开发 三、MyBaits核心配置文件四、 配置文件的增删改查4.1 M…...
leetcode410. 分割数组的最大值 动态规划
hard:https://leetcode.cn/problems/split-array-largest-sum/ 给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法使得这 m 个子数组各自和的最大值最小。 示例 1:输入:nums [7,2,5,1…...
C函数指针与类型定义
#include <stdio.h> #define PI 3.14 typedef int uint32_t; /* pfun is a pointer and its type is void (*)(void) */ void (*pfun)(void); /* afer typedef like this we can use “pfun1” as a data type to a function that has form like: / -------…...
最新2024届【海康威视】内推码【GTK3B6】
最新2024届【海康威视】内推码【GTK3B6】 【内推码使用方法】 1.请学弟学妹们登录校招官网,选择岗位投递简历; 2.投递过程中填写内推码完成内推步骤,即可获得内推特权。 内推码:GTK3B6 内推码:GTK3B6 内推码&…...
边写代码边学习之LSTM
1. 什么是LSTM 长短期记忆网络 LSTM(long short-term memory)是 RNN 的一种变体,其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径,让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲&a…...
Elasticsearch8.8.0 SpringBoot实战操作各种案例(索引操作、聚合、复杂查询、嵌套等)
Elasticsearch8.8.0 全网最新版教程 从入门到精通 通俗易懂 配置项目 引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency><dependency>&l…...
《MySQL高级篇》十五、其他数据库日志
文章目录 1. MySQL支持的日志1.1 日志类型1.2 日志的弊端 2. 慢查询日志(slow query log)3. 通用查询日志3.1 问题场景3.2 查看当前状态3.3 启动日志3.4 查看日志3.5 停止日志3.6 删除\刷新日志 4. 错误日志(error log)4.1 启动日志4.2 查看日志4.3 删除\刷新日志4.4 MySQL8.0新…...
【Linux】【预】配置虚拟机的桥接网卡+nfs
【Linux】【预】配置虚拟机的桥接网卡 1. 配置VM虚拟机的桥接网络2 配置Win10中的设置3.配置Linux中的IP4. 串口连接开发板,配置nfs5 修改网络文件6 验证nfs 是否成功总结 1. 配置VM虚拟机的桥接网络 右击设置,选择添加网络,按照如下顺序操作…...
【Android】Retrofit2和RxJava2新手快速上手
写这篇博客的目的 网上关于Retrofit2和RxJava2的博客特别多,但是内容特别复杂,一上来就讲解很高级的用法 其实我们没必要像高考做题家一样,把每个API都背的滚瓜烂熟 熟悉基本用法,高阶用法需要的时候再逐个了解就行了 因为博客…...
1.4 Nacos注册中心
目录 什么是Nacos Nacos下载和安装 下载和安装 启动 Nacos服务注册与发现 Nacos的服务分级存储模型 什么是分级存储模型 配置实例集群 配置同集群优先的负载均衡 权重配置 点击编辑按钮 配置所需的权重 环境隔离 创建namespace 什么是Nacos Nacoshttps://nacos.i…...
AOJ 2200 Mr. Rito Post Office 最短路径+动态规划+谨慎+思维
我写了好多注释,一看就能看懂,这个题目我想了6,7个小时,一开始忽略了船的位置和要把船安置的位置一致的情况,补上就对了。 #include <iostream> using namespace std; int inf 0x3f3f3f3f, num[1007], dp[1007…...
红米电视 ADB 安装 app 报错 failed to authenticate xxx:5555
开启电视开发者模式,允许安装未知来源应用及开启 ADB 调试电脑端下载 adb 工具 点击下载同一局域网的电脑使用 adb 工具连接(提前查看电视 IP)D:\adb>adb connect 192.168.1.7 * daemon not running; starting now at tcp:5037 * daemon s…...
Linux 下设置开机自启动的方法
文章目录 事先准备对于普通的 Linux对于 RedHat Enterprise Linux 9 笔者的运行环境: 设置成功过的 Linux: RedHat Enterprise Linux 9 x86_64 CentOS 8 x86_64 事先准备 进行这个教程之前,必须要先安装好一个 Linux 操作系统。这个 Linux…...
MySQL常见问题处理(三)
MySQL 常见问题解决 夕阳留恋的不是黄昏,而是朝阳 上一章简单介绍了MySQL数据库安装(二), 如果没有看过, 请观看上一章 一. root 用户密码忘记,进行重置操作 复制内容来源链接: https://blog.csdn.net/weixin_48927364/article/details/123556927 一.…...
不止是拆网卡:以联想ThinkCentre M7131z为例,聊聊老旧一体机的升级改造可能性
联想ThinkCentre M7131z改造指南:从拆网卡到全面性能升级 老旧商用一体机往往被贴上"性能瓶颈"的标签,但联想ThinkCentre M7131z系列却隐藏着令人惊喜的改造潜力。这台发布于2015年前后的商用一体机,凭借其模块化设计和充足的内部空…...
ssm+java2026年毕设蔬果批发网络平台【源码+论文】
本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于农产品电商交易模式的研究,现有研究主要以综合电商平台(如淘宝、京东)的农产品销售模式…...
3大焕新方案:老旧iOS设备性能重生全指南
3大焕新方案:老旧iOS设备性能重生全指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 老旧iOS设备随着系统…...
OPC UA over HTTPS解析卡顿,Modbus TCP粘包丢帧,Java工业协议解析故障全图谱,一线工程师紧急避坑手册
第一章:Java工业协议解析故障全景概览 在现代工业物联网(IIoT)系统中,Java 应用常作为上位机、网关或边缘服务承担 Modbus TCP、OPC UA、S7Comm、DNP3 等协议的解析与桥接任务。然而,由于协议语义复杂、设备厂商实现差…...
别再死记硬背公式了!用Simulink玩转单相全桥逆变,从方波驱动到IGBT参数设置全解析
用Simulink玩转单相全桥逆变:从方波驱动到IGBT参数设置的实战指南 电力电子领域的学习常常陷入公式推导的泥潭,而Simulink提供的可视化仿真环境就像一盏明灯。想象一下,当你调整一个参数就能立即看到波形变化,比纸上推导要直观十倍…...
Wan2.2-T2V-A5B常见错误排查:运行失败、生成卡顿的解决方法
Wan2.2-T2V-A5B常见错误排查:运行失败、生成卡顿的解决方法 1. 问题概述与快速诊断 Wan2.2-T2V-A5B作为一款轻量级文本到视频生成模型,虽然在资源消耗和响应速度上具有优势,但在实际使用过程中仍可能遇到运行失败或生成卡顿的问题。这些问题…...
pandas API on Spark 与 pandas / PySpark 互转指南
1. 为什么会有互转需求 pandas API on Spark 的定位很特殊:它既想保留 pandas 的使用体验,又建立在 Spark 的分布式执行之上。因此开发时常见的场景有三种: 已经有 pandas 代码,想迁移到分布式环境已经在用 PySpark DataFrame&…...
3步精通Path of Building PoE2:流放之路2玩家的角色规划零门槛指南
3步精通Path of Building PoE2:流放之路2玩家的角色规划零门槛指南 【免费下载链接】PathOfBuilding-PoE2 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2 你是否曾在《流放之路2》中遭遇这样的困境:投入数十小时培养的…...
清北博雅考研集训营:沉浸式封闭备考,为考研人铺就上岸之路
考研的赛道上,从来都不缺努力的人,缺的是科学的规划、优质的师资和沉浸式的备考环境。清北博雅教育集团深耕考研辅导领域十余载,凭借专业的教学体系、大咖级师资团队、完善的教学服务和亮眼的上岸成果,打造了专属考研人的集训营备…...
保姆级教程:在OBBDetection项目中为DOTA数据集定制检测结果可视化(mmdetection 2.2)
深度定制OBBDetection检测结果可视化:DOTA数据集高级实践指南 在旋转目标检测领域,DOTA数据集因其复杂的航拍场景和多角度目标特性,对结果可视化提出了独特挑战。本文将带您从零构建一套完整的可视化解决方案,涵盖从基础配置到高级…...
