class034 链表高频题目和必备技巧【算法】

class034 链表高频题目和必备技巧【算法】

在这里插入图片描述

在这里插入图片描述

code1 160. 相交链表

// 返回两个无环链表相交的第一个节点
// 测试链接 : https://leetcode.cn/problems/intersection-of-two-linked-lists/

容器法:HashSet记录list1,遍历list2,看是否包含在HashSet中
思路:让长链表先走diff步,短链表之后一起走

package class034;// 返回两个无环链表相交的第一个节点
// 测试链接 : https://leetcode.cn/problems/intersection-of-two-linked-lists/
public class Code01_IntersectionOfTwoLinkedLists {// 提交时不要提交这个类public static class ListNode {public int val;public ListNode next;}// 提交如下的方法public static ListNode getIntersectionNode(ListNode h1, ListNode h2) {if (h1 == null || h2 == null) {return null;}ListNode a = h1, b = h2;int diff = 0;while (a.next != null) {a = a.next;diff++;}while (b.next != null) {b = b.next;diff--;}if (a != b) {return null;}if (diff >= 0) {a = h1;b = h2;} else {a = h2;b = h1;}diff = Math.abs(diff);while (diff-- != 0) {a = a.next;}while (a != b) {a = a.next;b = b.next;}return a;}}

code2 25. K 个一组翻转链表

// 每k个节点一组翻转链表
// 测试链接:https://leetcode.cn/problems/reverse-nodes-in-k-group/
容器法:放到数组中,swap结点
思路:每次反转k个

package class034;// 每k个节点一组翻转链表
// 测试链接:https://leetcode.cn/problems/reverse-nodes-in-k-group/
public class Code02_ReverseNodesInkGroup {// 不要提交这个类public static class ListNode {public int val;public ListNode next;}// 提交如下的方法public static ListNode reverseKGroup(ListNode head, int k) {ListNode start = head;ListNode end = teamEnd(start, k);if (end == null) {return head;}// 第一组很特殊因为牵扯到换头的问题head = end;reverse(start, end);// 翻转之后start变成了上一组的结尾节点ListNode lastTeamEnd = start;while (lastTeamEnd.next != null) {start = lastTeamEnd.next;end = teamEnd(start, k);if (end == null) {return head;}reverse(start, end);lastTeamEnd.next = end;lastTeamEnd = start;}return head;}// 当前组的开始节点是s,往下数k个找到当前组的结束节点返回public static ListNode teamEnd(ListNode s, int k) {while (--k != 0 && s != null) {s = s.next;}return s;}// s -> a -> b -> c -> e -> 下一组的开始节点// 上面的链表通过如下的reverse方法调整成 : e -> c -> b -> a -> s -> 下一组的开始节点public static void reverse(ListNode s, ListNode e) {e = e.next;ListNode pre = null, cur = s, next = null;while (cur != e) {next = cur.next;cur.next = pre;pre = cur;cur = next;}s.next = e;}}

code3 138. 随机链表的复制

// 复制带随机指针的链表
// 测试链接 : https://leetcode.cn/problems/copy-list-with-random-pointer/
容器法:HashMap<原型,克隆>
思路:1把克隆结点插入到原型结点之后 2每两个取出来,设置r指针 3分离链表

package class034;// 复制带随机指针的链表
// 测试链接 : https://leetcode.cn/problems/copy-list-with-random-pointer/
public class Code03_CopyListWithRandomPointer {// 不要提交这个类public static class Node {public int val;public Node next;public Node random;public Node(int v) {val = v;}}// 提交如下的方法public static Node copyRandomList(Node head) {if (head == null) {return null;}Node cur = head;Node next = null;// 1 -> 2 -> 3 -> ...// 变成 : 1 -> 1' -> 2 -> 2' -> 3 -> 3' -> ...while (cur != null) {next = cur.next;cur.next = new Node(cur.val);cur.next.next = next;cur = next;}cur = head;Node copy = null;// 利用上面新老节点的结构关系,设置每一个新节点的random指针while (cur != null) {next = cur.next.next;copy = cur.next;copy.random = cur.random != null ? cur.random.next : null;cur = next;}Node ans = head.next;cur = head;// 新老链表分离 : 老链表重新连在一起,新链表重新连在一起while (cur != null) {next = cur.next.next;copy = cur.next;cur.next = next;copy.next = next != null ? next.next : null;cur = next;}// 返回新链表的头节点return ans;}}

code4 234. 回文链表

// 判断链表是否是回文结构
// 测试链接 : https://leetcode.cn/problems/palindrome-linked-list/

容器法:数组判断 压栈得到逆序
思路:快慢指针找到链表中点,然后翻转后一半的链表,接着对比左右链表的链表;最后记得还原链表。
考研常考:a1->a8->a2->a7->a3->a6->a4->a5

package class034;// 判断链表是否是回文结构
// 测试链接 : https://leetcode.cn/problems/palindrome-linked-list/
public class Code04_PalindromeLinkedList {// 不要提交这个类public static class ListNode {public int val;public ListNode next;}// 提交如下的方法public static boolean isPalindrome(ListNode head) {if (head == null || head.next == null) {return true;}ListNode slow = head, fast = head;// 找中点while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}// 现在中点就是slow,从中点开始往后的节点逆序ListNode pre = slow;ListNode cur = pre.next;ListNode next = null;pre.next = null;while (cur != null) {next = cur.next;cur.next = pre;pre = cur;cur = next;}// 上面的过程已经把链表调整成从左右两侧往中间指// head -> ... -> slow <- ... <- preboolean ans = true;ListNode left = head;ListNode right = pre;// left往右、right往左,每一步比对值是否一样,如果某一步不一样答案就是falsewhile (left != null && right != null) {if (left.val != right.val) {ans = false;break;}left = left.next;right = right.next;}// 本着不坑的原则,把链表调整回原来的样子再返回判断结果cur = pre.next;pre.next = null;next = null;while (cur != null) {next = cur.next;cur.next = pre;pre = cur;cur = next;}return ans;}}

code5 142. 环形链表 II

// 返回链表的第一个入环节点
// 测试链接 : https://leetcode.cn/problems/linked-list-cycle-ii/

容器法:HashSet存入遍历到的结点,如果存在被记录过,就是有环,返回被记录的结点
快慢指针:快指针一次走2步,慢指针一次走1步,直到相遇;快指针从起点一次走一步,慢指针从相遇点一次走一步,直到再次相遇,即是第一个入环节点。

package class034;// 返回链表的第一个入环节点
// 测试链接 : https://leetcode.cn/problems/linked-list-cycle-ii/
public class Code05_LinkedListCycleII {// 不要提交这个类public static class ListNode {public int val;public ListNode next;}// 提交如下的方法public static ListNode detectCycle(ListNode head) {if (head == null || head.next == null || head.next.next == null) {return null;}ListNode slow = head.next;ListNode fast = head.next.next;while (slow != fast) {if (fast.next == null || fast.next.next == null) {return null;}slow = slow.next;fast = fast.next.next;}fast = head;while (slow != fast) {slow = slow.next;fast = fast.next;}return slow;}}

code6 148. 排序链表

// 排序链表
// 要求时间复杂度O(n*logn),额外空间复杂度O(1),还要求稳定性
// 数组排序做不到,链表排序可以
// 测试链接 : https://leetcode.cn/problems/sort-list/

package class034;// 排序链表
// 要求时间复杂度O(n*logn),额外空间复杂度O(1),还要求稳定性
// 数组排序做不到,链表排序可以
// 测试链接 : https://leetcode.cn/problems/sort-list/
public class Code06_SortList {// 不要提交这个类public static class ListNode {public int val;public ListNode next;}// 提交如下的方法// 时间复杂度O(n*logn),额外空间复杂度O(1),有稳定性// 注意为了额外空间复杂度O(1),所以不能使用递归// 因为mergeSort递归需要O(log n)的额外空间public static ListNode sortList(ListNode head) {int n = 0;ListNode cur = head;while (cur != null) {n++;cur = cur.next;}// l1...r1 每组的左部分// l2...r2 每组的右部分// next 下一组的开头// lastTeamEnd 上一组的结尾ListNode l1, r1, l2, r2, next, lastTeamEnd;for (int step = 1; step < n; step <<= 1) {// 第一组很特殊,因为要决定整个链表的头,所以单独处理l1 = head;r1 = findEnd(l1, step);l2 = r1.next;r2 = findEnd(l2, step);next = r2.next;r1.next = null;r2.next = null;merge(l1, r1, l2, r2);head = start;lastTeamEnd = end;while (next != null) {l1 = next;r1 = findEnd(l1, step);l2 = r1.next;if (l2 == null) {lastTeamEnd.next = l1;break;}r2 = findEnd(l2, step);next = r2.next;r1.next = null;r2.next = null;merge(l1, r1, l2, r2);lastTeamEnd.next = start;lastTeamEnd = end;}}return head;}// 包括s在内,往下数k个节点返回// 如果不够,返回最后一个数到的非空节点public static ListNode findEnd(ListNode s, int k) {while (s.next != null && --k != 0) {s = s.next;}return s;}public static ListNode start;public static ListNode end;// l1...r1 -> null : 有序的左部分// l2...r2 -> null : 有序的右部分// 整体merge在一起,保证有序// 并且把全局变量start设置为整体的头,全局变量end设置为整体的尾public static void merge(ListNode l1, ListNode r1, ListNode l2, ListNode r2) {ListNode pre;if (l1.val <= l2.val) {start = l1;pre = l1;l1 = l1.next;} else {start = l2;pre = l2;l2 = l2.next;}while (l1 != null && l2 != null) {if (l1.val <= l2.val) {pre.next = l1;pre = l1;l1 = l1.next;} else {pre.next = l2;pre = l2;l2 = l2.next;}}if (l1 != null) {pre.next = l1;end = r1;} else {pre.next = l2;end = r2;}}}

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

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

相关文章

从零开始学Python网络编程:轻松搭建服务器和客户端

Python网络编程的基础知识是成为一名全面的Python开发者的关键一步。网络编程使我们能够创建各种类型的网络应用程序&#xff0c;从简单的客户端/服务器应用到复杂的Web应用和网络爬虫。 在本文中&#xff0c;我将会学习到Python网络编程的基础概念&#xff0c;包括套接字、服…

Spring boot -- 学习HttpMessageConverter

文章目录 1. Json格式数据获取2. 为什么返回Json格式的数据2.1 注解SpringBootAppliaction2.1.1 SpringBootConfiguration2.1.2 ComponentScan2.1.3 EnableAutoConfiguration2.1.3.1 HttpMessageConvertersAutoConfiguration2.1.3.2 WebMvcAutoConfiguration 2.2 注解RestContr…

石油化工园区:安全管理工作中的挑战与措施

石油化工园区&#xff1a;安全管理工作中的挑战与措施 石油化工园区是一种设备设施多且结构复杂的工业园区&#xff0c;涉及到易燃易爆或有毒介质&#xff0c;同时园区内有大量的工作人员和工作车辆等动态参与要素。由于园区的特殊性质&#xff0c;安全管理工作显然具备较高的挑…

农用烘干机市场分析:我国市场规模为190亿元

农用烘干机是运用在农业烘干领域的传统干燥设备之一&#xff0c;主要是为了农副产品直接使用或满足进一步加工的需要。农用烘干机具有操作弹性大、适应性强、处理能力大、设备运转可靠等优点&#xff0c;能大幅度提高农副产品烘干效率。现阶段&#xff0c;我国农用烘干机的市场…

AI助力智慧农业,基于YOLOv6最新版本模型开发构建不同参数量级农田场景下庄稼作物、杂草智能检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义&#xff0c;在前面的系列博文中&#xff0c;我们从一些现实世界里面的所见所想所感进行了很多对应的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《自建数据集&#xff0c;基于YOLOv7开发构建农田场景下杂草…

element中el-table表头通过header-row-style设置样式

文章目录 一、知识点二、设置全部表头2.1、方式一2.2、方式二 三、设置某个表头四、最后 一、知识点 有些时候需要给element-ui表头设置不同样式&#xff0c;比如居中、背景色、字体大小等等&#xff0c;这时就可以用到本文要说的属性header-row-style。官网说明如下所示&…

通用plantuml 时序图(Sequence Diagram)模板头

通用plantuml文件 startuml participant Admin order 0 #87CEFA // 参与者、顺序、颜色 participant Student order 1 #87CEFA participant Teacher order 2 #87CEFA participant TestPlayer order 3 #87CEFA participant Class order 4 #87CEFA participant Subject order …

关于支持向量机(SVM)的QSAR的结果的分析

图中的灰色部分代表了预测pIC50值与实测pIC50值之间的95%置信区间&#xff08;confidence interval&#xff09;。这个区间提供了一个预测误差的范围&#xff0c;意味着在统计上&#xff0c;我们有95%的把握认为真实值会落在这个区间内。具体来说&#xff0c;这个置信区间围绕着…

23、pytest通过skip跳过测试用例

官方实例 # content of test_skip.py import pytest import syspytest.mark.skip(reason"no way of currently testing this") def test_the_unknown():passdef valid_config():return Falsedef test_function():if not valid_config():pytest.skip("unsupport…

技术博客:Vue中各种混淆用法汇总

技术博客&#xff1a;Vue中各种混淆用法汇总 摘要 本文主要介绍了在Vue中使用的一些常见混淆用法&#xff0c;包括new Vue()、export default {}、createApp()、Vue.component、Vue3注册全局组件、Vue.use()等&#xff0c;以及如何使用混淆器对代码进行加固&#xff0c;保护应…

Hadoop学习笔记(HDP)-Part.19 安装Kafka

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

分类信息发布小程序效果如何

信息发布系统连接信息供需双方&#xff0c;打造信息聚合平台&#xff0c;用户可获取和发布需求信息、参与互动交流&#xff0c;适用于同城、社区交流、客户互动、业务员/经纪人发布信息场景。 制作分类信息小程序后&#xff0c;商家后台设置信息项&#xff0c;发布者填写内容发…

腾讯云轻量应用服务器挂载对象存储详细说明

腾讯云轻量对象存储LighthouseCOS是腾讯云专为中小企业开发者打造的轻量级数据存储服务&#xff0c;适用于云端网站、小程序、课堂演示、云盘/图床等场景下的数据存储和处理任务。腾讯云百科txybk.com详细介绍腾讯云轻量对象存储使用、开通和收费价格说明&#xff1a; 轻量对象…

配置CentOS服务器以支持PHP

CentOS是一款优秀的开源服务器操作系统&#xff0c;为各种网络服务提供了强大的支持。为了使CentOS服务器能够支持PHP&#xff0c;我们需要进行一些必要的配置。下面将介绍配置CentOS服务器以支持PHP的关键步骤。 安装PHP 首先&#xff0c;需要安装PHP解释器。在CentOS上&…

【python】使用pipenv创建虚拟环境进行打包

文章目录 一、pipenv 介绍二、快速上手使用pipenv2.1 安装pipenv2.2 创建虚拟环境2.3 激活环境2.4 虚拟环境中安装项目依赖包2.5 检查项目在虚拟环境中是否能正常运行2.6 打包项目2.7 删除虚拟环境 起因: 本地安装的模块太多,使用pyinstaller打包,会把许多无关模块打包进去&…

【头歌系统数据库实验】实验5 SQL的多表查询-1

目录 第1关&#xff1a;等值连接&#xff1a;求S表和J表城市相同的等值连接(列顺序还是按照S、J表) 第2关&#xff1a;查询供应情况&#xff0c;并显示供应商、零件和工程三者的名称 第3关&#xff1a;找出上海厂商供应的所有零件号码 第4关&#xff1a;找出使用上海产的零…

关于inline函数声明和定义为什么不可以分离

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言 inline函数在使用时声明和定义不可以分离&#xff0c;接下来我们将会解释为什么是这样的。 我们从程序的编译链接说起。 首先我们先介绍一下程序的翻译环境&#xff1a; 编译分以下几个步骤&#xff0c;预处理&#x…

Hadoop学习笔记(HDP)-Part.08 部署Ambari集群

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

R语言【rgbif】——最全最详细的函数解读(occ_search)

occ_search最全最详细的参数解读 occ_search有什么作用&#xff1f;occ_search有哪些参数&#xff1f;occ_search的参数使用&#xff1f;aa. 通过名称完成筛选的参数1. taxonKey&#xff08;用于检索的类群的标识符&#xff09;2. scientificName&#xff08;用于检索的类群的科…

U盘文件突然不见了怎么恢复?文件恢复(3个方法)!

“好奇怪呀&#xff01;一般我都会把比较重要的文件保存在u盘中&#xff0c;但是今天使用u盘的时候却发现u盘里的文件突然不见了&#xff0c;这是为什么呢&#xff1f;我怎么才能恢复这些数据呢&#xff1f;” 在我们的日常生活和工作中&#xff0c;U盘作为一种便携式的存储设备…