LeetCode刷题--- 430. 扁平化多级双向链表(双指针)

news2024/11/27 12:58:13

文章目录

  • 一、编程题:430. 扁平化多级双向链表(双指针)
      • 1.题目描述
      • 2.示例1:
      • 3.示例2:
      • 4.示例3:
      • 5.提示:
  • 二、解题思路
      • 1.思路
      • 2.复杂度分析:
      • 3.算法图解
  • 三、代码实现
  • 总结


一、编程题:430. 扁平化多级双向链表(双指针)

1.题目描述

  你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列表,以此类推,以生成如下面的示例所示的 多层数据结构 。
  给定链表的头节点 head ,将链表 扁平化 ,以便所有节点都出现在单层双链表中。让 curr 是一个带有子列表的节点。子列表中的节点应该出现在扁平化列表中的 curr 之后 和 curr.next 之前 。
  返回扁平列表的 head 。列表中的节点必须将其 所有 子指针设置为 null 。 LeetCode题目链接。

2.示例1:

在这里插入图片描述

输入:head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]
输出:[1,2,3,7,8,11,12,9,10,4,5,6]
解释:输入的多级列表如上图所示。
扁平化后的链表如下图:

在这里插入图片描述

3.示例2:

在这里插入图片描述

输入:head = [1,2,null,3]
输出:[1,3,2]
解释:输入的多级列表如上图所示。
扁平化后的链表如下图:

在这里插入图片描述

4.示例3:

输入:head = []
输出:[]
说明:输入中可能存在空列表。

5.提示:

  • 节点数目不超过 1000
  • 1 <= Node.val <= 105

如何表示测试用例中的多级链表?

以 示例 1 为例:

1—2—3—4—5—6–NULL
     |
     7—8—9—10–NULL
         |
         11–12–NULL

序列化其中的每一级之后:

[1,2,3,4,5,6,null]
[7,8,9,10,null]
[11,12,null]

为了将每一级都序列化到一起,我们需要每一级中添加值为 null 的元素,以表示没有节点连接到上一级的上级节点。

[1,2,3,4,5,6,null]
[null,null,7,8,9,10,null]
[null,11,12,null]

合并所有序列化结果,并去除末尾的 null 。

[1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]


二、解题思路

  本题总体思路还是很简单的,就是将多个
  这题采用双指针,本题主要关键点为:

  • 1.该怎么去移动这两个指针?这一点要理清楚。这里双指针移动就比较简单了,分别向下移动一步即可;
  • 2.本题中两个指针分别指向链表当前节点和子节点的尾节点,然后尾节点(子节点的)链接在当前节点后并将当前节点的子节点置为空;
  • 3.在遍历过程中,需要不断维护这两个节点;

1.思路

解决方法1(个人想法):

  • Step 1.创建指针temp指向链表中头节点heap,tempChlid用于指向当前节点的子节点,初始值为null;
  • Step 2.当temp存在子节点时,tempChlid = temp.chlid,找到tempChlid的尾节点,然后将子节点的链表插入到当前节点temp后即可;
  • Step 3.重复2步骤,直到temp为null时循环终止,并返回链表头节点;

看不懂解释的话,直接看算法图解比较容易理解点

2.复杂度分析:

时间复杂度:每个节点被访问的次数仍为常数次,复杂度为O(n)。
空间复杂度:O(1)。我们只需要常数的空间存放若干变量。

3.算法图解

链表初始状态(注:本人不会做成流程动画,希望会的朋友可以私信我指点一二,说个软件名字也可以,谢谢

请添加图片描述

链表遍历过程
红色部分代表遍历到链表有子节点的节点,灰色部分代表子节点列表的尾节点

请添加图片描述


三、代码实现

每个代码块都写了注释,方便理解,代码还可以改进;

class Solution {
    public Node flatten(Node head) {
        Node temp = head, tempChlid;
        while(temp != null){
            // temp.child =null;
            
            // 当前节点存在子节点时,对子节点链表进行处理;
            if(temp.child != null){
                tempChlid = temp.child;
                
                // 找到链表尾节点
                while(tempChlid.next != null){
                    tempChlid = tempChlid.next;
                }
                // 调试专用
                // System.out.println("chilid.val = " + temp.child.val + " tempChlid.val = " + tempChlid.val);
                // 将上一级节点的后继节点拼接在子节点的链表尾节点后面
                tempChlid.next = temp.next;
                // 如果上一级节点的后继节点不为空的话,该后继节点的前驱节点指向子节点链表的尾节点
                if(temp.next != null) temp.next.prev = tempChlid;

                // 连接之后子节点的前驱节点指向当前节点,当前节点后继节点为子节点
                temp.next = temp.child; 
                temp.child.prev = temp;
                
            }
            // System.out.println("temp.val = " + temp.val);
            // 处理该节点的子节点之后,可将子节点指针置为空,同时将当前指针往后移下一位
            temp.child = null;
            temp = temp.next;
        }
        return head;
    }
}

提交结果:

在这里插入图片描述


总结

以上就是今天要讲的内容,这一题还是比较简单的,一看到这题的时候就立马想到同时遍历两个链表,然后把其中一个链表当做返回参数,让第二个链表的节点往里面插入即可。

感谢观看,如果有帮助到你,请给题解点个赞和收藏,让更多的人看到。🌹🌹🌹

也欢迎你,关注我。👍👍👍

你们的点赞和留言对我真的很重要!!!😄😄😄

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

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

相关文章

网页防篡改实验(6)

实验简介 实验所属系列&#xff1a;网络攻防工具 实验对象&#xff1a; 本科/专科信息安全专业 相关课程及专业&#xff1a;信息网络安全概论、计算机网络 实验时数&#xff08;学分&#xff09;&#xff1a;2学时 实验类别&#xff1a;实践实验类 实验目的 1、了解网页防篡改…

7.数据库设计

学习过程参考&#xff08;后续章节同&#xff09; 【公开课】数据库系统概论&#xff08;王珊老师&#xff09;&#xff08;完结&#xff09; 《数据库系统概论》思维导图 第7章 数据库设计 | 数据库知识点整理 梳理 名词解释 数据库设计(database design)&#xff1a;数据库…

从2023年31省级政府工作报告看数据安全赛道 | 附下载

数字经济是支撑我国经济增长的新动能。据中国信息通信研究院数据&#xff0c;2021年我国数字经济规模超45万亿元、在GDP已占比40%&#xff0c;到2025年我国数字经济规模预计超60万亿元。春节前夕&#xff0c;地方两会陆续召开&#xff0c;从各地发布的2022年经济社会发展成绩来…

NodeJS与npm版本不一致时降级npm的方法

首先查看 Node.js 与 npm 版本对应关系&#xff1a;Node.js与npm版本查看。 安装 cnpm&#xff1a; npm install -g cnpm 查看一下 npm 和 cnpm 的镜像&#xff1a; npm config get registry cnpm config get registry 2 如果不是 https://registry.npm.taobao.org/ 的话就修…

【C++】CC++内存管理

就是你被爱情困住了&#xff1f;Wake up bro&#xff01; 文章目录一、C/C内存分布二、C语言中动态内存管理方式三、C中内存管理方式1.new和delete操作内置类型2.new和delete操作自定义类型&#xff08;仅限vs的底层实现机制&#xff0c;new和delete一定要匹配使用&#xff0c;…

【Linux】TCP网络编程流程

TCP网络编程流程 上一节博文我们提到了网络编程的基本流程 现在我们来了解TCP网络编程的流程 在这之前我们先要了解TCP 首先TCP是一种传输控制协议 在因特网协议族&#xff08;Internet protocol suite&#xff09;中&#xff0c;TCP层是位于IP层之上&#xff0c;应用层之…

MIT 6.S965 韩松课程 02

Lecture 02: Basics of Neural Networks TitleBasics of Neural NetworksLecturerSong HanDate09/13/2022Note AuthorGuangxuan Xiao (xgx)DescriptionReview the basics of deep learning and introduce efficiency metrics for neural networks. 回顾深度学习的基础知识&…

SparkSQL 核心编程

文章目录SparkSQL 核心编程1、新的起点2、SQL 语法1) 读取 json 文件创建 DataFrame2) 对 DataFrame 创建一个临时表3) 通过SQL语句实现查询全表3、DSL 语法1) 创建一个DataFrame2) 查看DataFrame的Schema信息3) 只查看"username"列数据4) 查看"username"列…

Elasticsearch(九)搜索---搜索辅助功能(下)--搜索性能分析

一、前言 上篇文章我们学习了ES的搜索辅助功能的一部分–分别是指定搜索返回的字段&#xff0c;搜索结果计数&#xff0c;分页&#xff0c;那么本次我们来学习一下ES的性能分析相关功能。 二、ES性能分析 在使用ES的过程中&#xff0c;有的搜索请求的响应比较慢&#xff0c;…

ChatGPT的火爆出圈,你对它有几分了解?

文章目录1.ChatGPT是什么&#xff1f;2.ChatGPT能做什么&#xff1f;2-1.什么是自然语言模型&#xff1f;3.ChatGPT带来的评价4.了解完ChatGPT之后&#xff0c;你会有什么反思&#xff1f;4-1.为什么微软不自己研发ChatGPT&#xff1f;4-2.Elon Musk为什么退出OpenAI公司&#…

分享116个JS焦点图代码,总有一款适合您

分享116个JS焦点图代码&#xff0c;总有一款适合您 116个JS焦点图代码下载链接&#xff1a;https://pan.baidu.com/s/1BKblAjuE98y5HlLAXZIndQ?pwdphgw 提取码&#xff1a;phgw Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj import os impo…

全国青少年编程等级考试scratch二级真题2022年9月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手1.数列&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;6&#xff0c;…

NLP学习笔记(八) GPT简明介绍

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲 GPT\text{GPT}GPT (Generative Pre-Training\textbf{G}\text{enerative}\ \textbf{P}\text{re-}\textbf{T}\text{raining}Generative Pre-Training) 实际上&#xff0c;GPT\text{GPT}GPT 包括一系列论文&#xff0c;具体有…

探针台常见的故障及解决方法

症状、 可能原因、 解决方法 移动样品后画面变模糊 —显微镜不垂直&#xff0c;调垂直显微镜 样品台不水平 —调水平样品台 显微镜视场亮度不足&#xff0c;边缘切割或看不到像—转换器不在定位位置上 把转换器转到定位位置上 管镜转盘不在定位位置上 —把管镜转盘转到定…

SpringCloud 中 Config、Bus、Stream、Sleuth

文章目录&#x1f68f; 第十三章 分布式配置中心&#x1f6ac; 一、Config 概述&#x1f6ac; 二、Config 快速入门&#x1f6ad; config-server&#xff1a;&#x1f6f9; 1、使用gitee创建远程仓库&#xff0c;上传配置文件&#x1f6f9; 2、导入 config-server 依赖&#x1…

【概念辨析】整型提升的深入理解(手画图解)

整型提升是一个小的知识点&#xff0c;但是请继续学习&#xff0c;保持空杯心态&#xff01; 目录 文章目录 前言 一、整型提升是什么&#xff1f; 二、发生整型提升的情况 1.字节数比int少的内置类型进行的整型提升 2.整型提升的规则 图解&#xff1a; 总结 前言 整型提升也是…

ubuntu18.04下交叉编译 nginx源码(支持推送H265的rtmp和http-flv)

ubuntu18.04下交叉编译 nginx源码&#xff08;支持推送H265的rtmp和http-flv&#xff09;适合在aarch64-linux-gnu平台下的交叉编译一、源码下载准备二、执行configure三、解决执行configure时遇到的出错问题1、checking for C compiler ... found but is not working2、error:…

Vue-第一天 前端工程化与 webpack

前端工程化与 webpack一、前端工程化1. 小白眼中的前端开发 vs 实际的前端开发2. 什么是前端工程化3. 前端工程化的好处4. 前端工程化的解决方案二、webpack 的基本使用1. 什么是 webpack2. 创建列表隔行变色项目3. 在项目中安装 webpack4. 在项目中配置 webpack4.1 mode 的可选…

Homekit智能家居DIY设备-智能通断开关

智能通断器&#xff0c;也叫开关模块&#xff0c;可以非常方便地接入家中原有开关、插座、灯具、电器的线路中&#xff0c;通过手机App或者语音即可控制电路通断&#xff0c;轻松实现原有家居设备的智能化改造。 随着智能家居概念的普及&#xff0c;越来越多的人想将自己的家改…

【微服务】Elasticsearch集群介绍搭建(六)

&#x1f697;Es学习第六站~ &#x1f6a9;Es学习起始站&#xff1a;【微服务】Elasticsearch概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 一.引入 单机的elasticsearch做数据存储&#xff0c;必然面临两个…