虚拟头节点和双指针解决链表问题(合并,与分解操作,力扣题目为例)

Problem: 21. 合并两个有序链表
Problem: 86. 分隔链表

文章目录

  • 总览说明
  • 题目描述
  • 思路
  • 复杂度
  • Code
  • 总结分析

总览说明

在解决链表相关的算法题目时较多使用到的技巧就是虚拟头节点、双指针,而题目往往都会涉及到对链表的分解、合并操作,本文选择两个题目将其利用技巧进行相关合并、分解操作显现出来;其中21题目主要体现合并操作,也较好理解;主要要注意86题目中在分解时的一个细节(下文会展示出来)

题目描述

  1. 合并两个有序链表在这里插入图片描述在这里插入图片描述
  1. 分隔链表
    在这里插入图片描述在这里插入图片描述

思路

21题

1.创建虚拟头节点dummy和尾指针p指向dummy;创建指针p1和p2分别指向list1和list2;
2.当p1和p2均不为空时,若p1.val > p2.val:

2.1.使得p指向p2;
2.2.p2指针后移;
2.3.tail指针后移,并使得tail -> next至空

3.若p1 -> val < = p2 -> val时,对p1执行与2类似的操作;
4.若p1和p2其中之一不为空,则将tail -> next指向它;并最后放回dummy -> next

86题

1.创建两个虚拟头节点dummy1(用于依次顺序存储原链表中比x值小的节点)、dummy2(用于依次顺序存储原链表中比x值大的节点);指针p1指向dummy1、p2指向dummy2,指针p指向初始链表表头head
2.将相关节点的合并操作同21题目类似(留给读者独立思考),此处主要要注意分解时的一个细节:每次先使用一个指针temp记录p.next,再将p.next置空,最后再让p指向temp(可能读者读到此处也感觉比较唐突,不妨可以先试着看如下代码先自己思考一下为什么)
3.最后将两个链表连接并返回正确的表头(由于前面是保证了依次顺序存储,所以题目要求的保持相对位置不变的要求也得到了实现)

复杂度

两道题目均如下
时间复杂度:

O ( n ) O(n) O(n);

空间复杂度:

O ( n ) O(n) O(n)

Code

21题

/*** 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 mergeTwoLists(ListNode list1, ListNode list2) {// virtual head nodeListNode dummy = new ListNode(Integer.MIN_VALUE);ListNode p = dummy;ListNode p1 = list1;ListNode p2 = list2;while (p1 != null && p2 != null) {// compare pointers p1 and p2// attach the node with smaller value to the pointerif (p1.val > p2.val) {p.next = p2;p2 = p2.next;} else {p.next = p1;p1 = p1.next;}// advance the p pointerp = p.next;}if (p1 != null) {p.next = p1;}if (p2 != null) {p.next = p2;}return dummy.next;}
}

86题

/*** 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 partition(ListNode head, int x) {// virtual head node for the list soring nodes less than xListNode dummy1 = new ListNode(Integer.MIN_VALUE);// virtual head node for the list soring nodes greater than xListNode dummy2 = new ListNode(Integer.MIN_VALUE);// p1, p2 pointers are responsible for creating the result listListNode p1 = dummy1;ListNode p2 = dummy2;// p is responsible for traversing the originalListNode p = head;while (p != null) {if (p.val >= x) {p2.next = p;p2 = p2.next; } else {p1.next = p;p1 = p1.next;}// Not move p pointer directly,// disconnect the next pointer of each node in the original listListNode temp = p.next;p.next = null;p = temp;}// connect the two listsp1.next = dummy2.next;return dummy1.next;}
}

总结分析

在21题目中主要是利用双指针进行一步步比较,再利用虚拟头节点去将其连接到一起
在86题目中其实最终要的是断开原来链表之间的连接(p.next = null;)所以由于需要断开原来链表之间的连接,所以无法直接移动p,需要先用一个指针记录当前指针p的下一个节点位置,再进一步来实现移动p的操作(那么为什么需要这样操作而不是就直接像21题目那样直接移动p指针呢?读者仔细自己举出一个例子模拟那种代码走一遍就会发现如果那样的话最后是存在环的),其实最主要的一点就是如果我们需要把原链表的节点接到新链表上,而不是 new 新节点来组成新链表的话,那么断开节点和原链表之间的链接可能是必要的(注意是可能必要),有时不断开也没什么影响但是断开却能保证不会出现不必要的错误

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

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

相关文章

Gaea项目的挑战与机遇:去中心化AI平台的未来发展

尽管Gaea在去中心化AI领域展示了巨大的潜力&#xff0c;但在实际操作中仍然面临一些挑战。首先&#xff0c;平台的用户参与度至关重要。如果用户参与的资源不足&#xff0c;平台的计算能力和带宽资源将受到限制&#xff0c;从而影响AI项目的运行效率。因此&#xff0c;如何吸引…

项目练习:若依后台管理系统-后端服务开发步骤(springboot单节点版本)

文章目录 1、用Maven搭建项目脚手架&#xff0c;父子工程依赖。2、引入SpringBoot Web容器依赖3、引入Mybatisdruid依赖4、实现接口查询数据5、整合logback日志功能6、集成Redis 1、用Maven搭建项目脚手架&#xff0c;父子工程依赖。 root模块的pom添加plugin配置 <build>…

批量创建ES索引

7.x from elasticsearch import Elasticsearch# 配置 Elasticsearch 连接 # 替换为你的 Elasticsearch 地址、端口、用户名和密码 es Elasticsearch([http://10.10.x.x:43885],basic_auth(admin, XN272G9THEAPYD5N5QORX3PB1TSQELLB) )# # 测试连接 # try: # # 尝试获取集…

ansible自动化运维实战--script、unarchive和shell模块(6)

文章目录 一、script模块1.1、功能1.2、常用参数1.3、举例 二、unarchive模块2.1、功能2.2、常用参数2.3、举例 三、shell模块3.1、功能3.2、常用参数3.3、举例 一、script模块 1.1、功能 Ansible 的 script 模块允许你在远程主机上运行本地的脚本文件&#xff0c;其提供了一…

【2024年终总结】深圳工作生活评测

距离上次写年终总结已经过了一年半了&#xff0c;这一年半中哪怕经历了很多的事情&#xff0c;但是感觉又没发生什么。想写一些骚话&#xff0c;却总觉得自己无法完全表达&#xff0c;便也就这样&#xff0c;静静地记录下这一段时光。 现在是2025年&#xff0c;春节前的时光&am…

VSCode+Continue实现AI辅助编程

Continue是一款功能强大的AI辅助编程插件&#xff0c;可连接多种大模型&#xff0c;支持代码设计优化、错误修正、自动补全、注释编写等功能&#xff0c;助力开发人员提高工作效率与代码质量。以下是其安装和使用方法&#xff1a; 一、安装VSCode 参见&#xff1a; vscode安…

【游戏设计原理】82 - 巴斯特原则

巴斯特原则的核心是“对你的玩家好一点”&#xff0c;这一点直击游戏设计的核心——玩家体验。 现代游戏设计不仅要注重挑战性&#xff0c;还要关注玩家的情绪波动与行为反应。当玩家因为过高的难度感到挫败甚至愤怒时&#xff0c;他们往往选择退出游戏&#xff0c;而不是迎接…

C++内存分布与进程地址空间

C内存分布与进程地址空间 1.C/C内存分布2.进程地址空间&#xff08;补充&#xff09; &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列专栏&#xff1a;【Linux的学习】 &#x1f4dd;&#x1f…

C语言内存管理详解

C语言不像其他高级语言那样提供自动内存管理&#xff0c;它要求程序员手动进行内存的分配和释放。在C语言中&#xff0c;动态内存的管理主要依赖于 malloc、calloc、realloc 和 free 等函数。理解这些函数的用法、内存泄漏的原因及其防止方法&#xff0c;对于编写高效、可靠的C…

头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果&#xff0c;下面将介绍该小程序的功能 页面template代码如下&#xff1a; <template><view class"avatar-containner"><block v-if"!showCropper"><image class"pageback" src"../../s…

使用 Confluent Cloud 的 Elasticsearch Connector 部署 Elastic Agent

作者&#xff1a;来自 Elastic Nima Rezainia Confluent Cloud 用户现在可以使用更新后的 Elasticsearch Sink Connector 与 Elastic Agent 和 Elastic Integrations 来实现完全托管且高度可扩展的数据提取架构。 Elastic 和 Confluent 是关键的技术合作伙伴&#xff0c;我们很…

Spring 定时任务:@Scheduled 注解四大参数解析

本文主要介绍了在 Spring 框架中使用Scheduled注解实现定时任务的方法&#xff0c;重点讲解了fixedRate、fixedDelay、cron和initialDelay这四个参数的用法&#xff0c;并通过实例代码进行了详细说明。 1. fixedRate 参数 参数含义 fixedRate指定任务固定时间间隔执行。如设…

刷题总结 回溯算法

为了方便复习并且在把算法忘掉的时候能尽量快速的捡起来 刷完回溯算法这里需要做个总结 回溯算法的适用范围 回溯算法是深度优先搜索&#xff08;DFS&#xff09;的一种特定应用&#xff0c;在DFS的基础上引入了约束检查和回退机制。 相比于普通的DFS&#xff0c;回溯法的优…

【MySQL】我在广州学Mysql 系列——MySQL用户管理详解

ℹ️大家好&#xff0c;我是练小杰&#xff0c;本博客是春节前最后一篇了&#xff0c;在此感谢大佬们今年的支持&#xff01;&#xff01;&#x1f64f;&#x1f64f; 接下来将学习MYSQL用户管理的相关概念以及命令~~ 回顾&#xff1a;&#x1f449;【MYSQL触发器的使用】 数据…

网络编程-网络原理HTTP1

文章目录 HTTP请求/响应的基本结构认识URLURL是什么和基本格式关于encoding机制 认识方法(method)GET方法简介GET方法的特点POST方法简介POST方法的特点GET和POST的区别(经典面试题)关于GET和POST的补充说明Restful风格 上节主要是对http协议的一些最基本的概念做出一些说明, 然…

概率密度函数(PDF)分布函数(CDF)——直方图累积直方图——直方图规定化的数学基础

对于连续型随机变量&#xff0c;分布函数&#xff08;Cumulative Distribution Function, CDF&#xff09;是概率密度函数&#xff08;Probability Density Function, PDF&#xff09;的变上限积分&#xff0c;概率密度函数是分布函数的导函数。 如果我们有一个连续型随机变量…

[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题)

[Python学习日记-79] socket 开发中的粘包现象&#xff08;解决模拟 SSH 远程执行命令代码中的粘包问题&#xff09; 简介 粘包问题底层原理分析 粘包问题的解决 简介 在Python学习日记-78我们留下了两个问题&#xff0c;一个是服务器端 send() 中使用加号的问题&#xff0c…

【落羽的落羽 数据结构篇】算法复杂度

文章目录 一、数据结构和算法简介二、算法复杂度1. 时间复杂度2. 空间复杂度 一、数据结构和算法简介 数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用&#xff0c;所以我们要学…

22_解析XML配置文件_List列表

解析XML文件 需要先 1.【加载XML文件】 而 【加载XML】文件有两种方式 【第一种 —— 使用Unity资源系统加载文件】 TextAsset xml Resources.Load<TextAsset>(filePath); XmlDocument doc new XmlDocument(); doc.LoadXml(xml.text); 【第二种 —— 在C#文件IO…

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

第十五届的题目在规定时间内做出了前5道&#xff0c;还有2道找时间再磨一磨。现在把做的一些思路总结如下&#xff1a; 题1&#xff1a;握手问题 问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例…