【LeetCode热题100】打卡第40天:翻转二叉树回文链表

news2024/10/7 6:44:45

文章目录

  • 【LeetCode热题100】打卡第40天:翻转二叉树&回文链表
    • ⛅前言
  • 翻转二叉树
    • 🔒题目
    • 🔑题解
  • 回文链表
    • 🔒题目
    • 🔑题解

【LeetCode热题100】打卡第40天:翻转二叉树&回文链表

⛅前言

大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏!

精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。在此专栏中,我们将会涵盖各种类型的算法题目,包括但不限于数组、链表、树、字典树、图、排序、搜索、动态规划等等,并会提供详细的解题思路以及Java代码实现。如果你也想刷题,不断提升自己,就请加入我们吧!QQ群号:827302436。我们共同监督打卡,一起学习,一起进步。

博客主页💖:知识汲取者的博客

LeetCode热题100专栏🚀:LeetCode热题100

Gitee地址📁:知识汲取者 (aghp) - Gitee.com

题目来源📢:LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

PS:作者水平有限,如有错误或描述不当的地方,恳请及时告诉作者,作者将不胜感激

翻转二叉树

🔒题目

原题链接:226.翻转二叉树

image-20230719090408045

🔑题解

  • 解法一:递归

    刷LeetCode热题100也有一个月了,现在有那么一丢丢的感觉了🤣,遇到树相关的问题,绝大多数递归就对了。

    这题同样使用递归,递归遍历左右子树一下就决解了,不愧是简单题,思路也很简单:先递归到最后一层,然后自底向上交换当前节点左右节点,这样就能够实现翻转二叉树了

    public class Solution {
        public TreeNode invertTree(TreeNode root) {
            if (root == null) {
                return null;
            }
            TreeNode left = invertTree(root.left);
            TreeNode right = invertTree(root.right);
            root.left = right;
            root.right = left;
            return root;
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n ) O(n) O(n),递归遍历树,需要遍历到每一个节点,所以时间复杂度自然是 O ( n ) O(n) O(n)
    • 空间复杂度: O ( l o g h ) O(logh) O(logh),递归遍历树,空间复杂度取决去树的高度

    其中 n n n 为树中节点的个数, h h h是树的高度

  • 解法二:迭代

    迭代本质和递归是一样的,只是将隐士的栈变成了显示的栈,和上面解法是完全等价的。

    不是很懂的可以区看这篇文章:【LeetCode热题100】打卡第27天:二叉树的前序、中序、后序遍历,这篇文章对迭代遍历树有较为详细的讲解

    public class Solution {
        public TreeNode invertTree(TreeNode root) {
            Deque<TreeNode> stack = new LinkedList<>();
            TreeNode cur = root;
            while (!stack.isEmpty() || cur != null) {
                // 遍历当前节点的左子树
                while (cur != null) {
                    stack.push(cur);
                    // 将指针指向左子节点
                    cur = cur.left;
                }
                TreeNode node = stack.pop();
                // 交换左右子节点
                TreeNode left = node.left;
                TreeNode right = node.right;
                node.left = right;
                node.right = left;
                // 将指针指向右子节点
                cur = right;
            }
            return root;
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n ) O(n) O(n),递归遍历树,需要遍历到每一个节点,所以时间复杂度自然是 O ( n ) O(n) O(n)
    • 空间复杂度: O ( l o g h ) O(logh) O(logh),递归遍历树,空间复杂度取决去树的高度

    其中 n n n 为树中节点的个数, h h h是树的高度

  • 解法三:利用遍历交换左右子节点

    在遍历的同时,可以交换左右节点,至于二叉树的遍历方式就有很多种了,常见的比如:中序后序前序层序,遍历方式又可以分为:递归、迭代,这么算起来,解法三就有 8 种不同的实现方式了🤣,这里我就只列举一种,其它方式,大家可以自己参考这我上一个解法中提到的那篇文章进行实现,这里我就使用层序遍历实现一下,关于层序遍历详细可以参考我的这篇文章:【LeetCode热题100】打卡第29天:二叉树的层序遍历,层序遍历的核心实现思路就是 BFS

    PS:其实解法一和解法二本质上就是采用中序遍历的思想:先左后中再右

    public class Solution {
        public TreeNode invertTree(TreeNode root) {
            if (root == null) {
                // 防止后面出现NPE
                return null;
            }
            Deque<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
            while (!queue.isEmpty()) {
                TreeNode node = queue.poll();
                TreeNode left = node.left;
                TreeNode right = node.right;
                node.left = right;
                node.right = left;
                if (left != null) {
                    queue.offer(left);
                }
                if (right != null) {
                    queue.offer(right);
                }
            }
            return root;
        }
    }
    

回文链表

🔒题目

原题链接:234.回文链表

image-20230719105451372

🔑题解

  • 解法一:暴力

    最直接的方法,遍历所有的节点,利用StringBuilder进行拼接,然后判断反转后的内容是否一致,如果一致则说明当前链表是一个回文串,否则不是,这里有一个比较坑的点,就是StringBuilder没有重写Object的toString方法,所以如果调用equals方法,比较的地址,所以这里我们需要将StringBuilder转成String(String重写了Object的toString方法),然后再调用equals方法进行比较

    public class Solution {
        public boolean isPalindrome(ListNode head) {
            StringBuilder sb = new StringBuilder();
            while (head != null) {
                sb.append(head.val);
                head = head.next;
            }
            String str1 = new StringBuilder(sb).reverse().toString();
            String str2 = sb.toString();
            return str1.equals(str2);
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n ) O(n) O(n)
    • 空间复杂度: O ( n ) O(n) O(n)

    其中 n n n 为链表中元素的个数

  • 解法二:快慢指针

    在写链表相关题目时,已经好几次遇到快慢指针了,从最开始的“我靠,还有这种方式😮“、到后来的“额原来还可以这样写😫”,再到现在的”不就是快慢指针吗,这不有手就行🤣“(我还没到这一种心态,我还在第二种心态o((>ω< ))o)

    算法实现的主要核心思路:快指针走到末尾,慢指针刚好到中间。其中慢指针将前半部分反转。然后比较

    关于反转链表的部分我们可以参考这一题:【LeetCode热题100】打卡第37天:反转链表

    关于快慢指针的部分我们可以参考这一题:【LeetCode热题100】打卡第34天:排序链表

    /**
     * @author ghp
     * @title
     */
    public class Solution {
        public boolean isPalindrome(ListNode head) {
            if (head.next == null) {
                // 链表只有一个节点,直接返回,防止后面出现NPE
                return true;
            }
            ListNode fast = head, slow = head, pre = null;
            // 定位中间节点,同时反转链表的前半段
            while (fast != null && fast.next != null) {
                // fast多走一步
                fast = fast.next.next;
                // 反转前半段链表
                ListNode next = slow.next;
                slow.next = pre;
                pre = slow;
                slow = next;
            }
            if (fast != null) {
                // 当前链表具有偶数个节点,还需要将slow往后移动一位
                slow = slow.next;
            }
            // 逐个比较 反转后的前半段链表 和 未反转的后半段链表 的节点的val是否相等
            while (pre != null && slow != null) {
                if (pre.val != slow.val) {
                    // 有一个节点的val不相等,说明当前链表不是回文链表
                    return false;
                }
                pre = pre.next;
                slow = slow.next;
            }
            // 前后两截链表的val都相等,则说明当前链表是回文链表
            return true;
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n ) O(n) O(n)
    • 空间复杂度: O ( 1 ) O(1) O(1)

    其中 n n n 为链表中元素的个数

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

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

相关文章

高数-第一章-函数-极限 连续

目录 第一章 函数 极限 连续第一节 函数第二节 极限一、极限的概念与性质&#xff08;1&#xff09;数列的极限例1例2 &#xff08;2&#xff09;函数的极限&#xff08;3&#xff09;极限的性质&#xff08;保号性重点 有界性&#xff09;例12例13例14 &#xff08;4&#xff…

Python 3 拷贝、浅拷贝、直接引用

诸神缄默不语-个人CSDN博文目录 复杂的以后再补。 总的来说&#xff0c;像常数、字符串这种比较简单的变量无所谓&#xff0c;但是对于一些复杂对象&#xff08;比如list等&#xff09;&#xff0c;如果直接使ba&#xff0c;相当于直接把a的路径给了b&#xff0c;b这个对象的…

stb_image简单使用

简介stb_image stb_image 是一个非常轻量级的、单文件的图像加载库&#xff0c;用于加载和解码多种图像格式&#xff08;如BMP、JPEG、PNG、GIF等&#xff09;的图像数据。它由Sean T. Barrett开发&#xff0c;并以公共领域&#xff08;Public Domain&#xff09;许可发布&…

【软件测试】web测试bug定位思路总结,“我“不再背锅...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 需要掌握的知识 …

LabVIEW - 采集声音并保存 wav 文件

1. 题目 编写程序&#xff0c;实现用户点击按钮时&#xff0c;采集声音&#xff0c;显示声音波形&#xff0c;对于采集的声音进行低频段、中频段、高频段分别进行适当的比例放大或者衰减&#xff0c;然后重新合成(三段相加即可)&#xff0c;并将合成的声音下入wav格式的文件保存…

【ROS】ROS1人机界面开发:第一个最简ROS+QtGui程序(按钮启动发布者)

【ROS】郭老二博文之:ROS目录 1、创建工程 1)新建工程:Other Project --> ROS Workspace 2)设置工程名称、路径 3)可以通过点击“Browse”来创建目录 注意:使用自带ros插件的qtcreator-ros,无法创建目录、也不能选择目录,这是个bug,因此需要在终端手动创建目录…

江南大学轴承数据故障诊断(利用连续小波变换转换为二维图像,再利用CNN进行故障诊断)

1.江南大学轴承数据集介绍 采样频率&#xff1a;50khz&#xff0c;采样时间&#xff1a;10s 转速&#xff1a;600 800 1000/rpm 内圈&#xff1a;ib 外圈&#xff1a;ob 滚动体&#xff1a;tb 正常&#xff1a;N 以600转速下的内圈故障数据为例展示&#xff1a; 开始数据…

【云原生】Prometheus 之PromQL

前言 当 Prometheus 通过 Exporter 采集到相应的监控指标样本数据后&#xff0c;我们就可以通过PromQL 对监控样本数据进行查询&#xff0c;从而对相应的数据样本进行分析以及制定报警规则。 1. PromQL的简介 PromQL&#xff08;Prometheus Query Language&#xff09;是 Prome…

SaleSmartly,客户满意度调查的绝对好助手

企业使用客户满意度调查来收集反馈并评估客户满意度水平&#xff0c;包括有关产品质量、服务、支持和整体满意度的问题。客户满意度调查的主要目标是直接从客户那里收集有价值的见解&#xff0c;以了解他们的需求、偏好和期望。这种反馈可以帮助企业确定需要改进的领域&#xf…

STM32案例学习 GY-39环境监测传感器模块

STM32案例学习 GY-39环境监测传感器模块 硬件平台 野火STM32F1系列开发板正点STM32F1系列开发板STM32F103ZET6核心板GY-39环境监测传感器模块 GY-39环境监测传感器模块 GY-39 是一款低成本&#xff0c;气压&#xff0c;温湿度&#xff0c;光强度传感器模块。工作电压 3-5v…

JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch

目录 1_前端数据请求方式1.1_前后端分离的优势1.2_网页的渲染过程 – 服务器端渲染1.3_网页的渲染过程 – 前后端分离 2_HTTP协议的解析2.1_HTTP概念2.2_网页中资源的获取2.3_HTTP的组成2.4_HTTP的版本2.5_HTTP的请求方式2.6_HTTP Request Header2.7_HTTP Response响应状态码 3…

京东自动化功能之商品信息监控是否有库存

这里有两个参数,分别是area和skuids area是地区编码,我这里统计了全国各个区县的area编码,用户可以根据实际地址进行构造skuids是商品的信息ID填写好这两个商品之后,会显示两种状态,判断有货或者无货状态,详情如下图所示 简单编写下python代码,比如我们的地址是北京市…

Kaggle:树叶分类(使用Jupyter)

竞赛网址&#xff1a;https://www.kaggle.com/c/classify-leaves # 首先导入包 import torch import torch.nn as nn import pandas as pd import numpy as np from torch.utils.data import Dataset, DataLoader from torchvision import transforms from PIL import Image i…

uniapp 小程序 实时拍照(仅拍照)限制上传5张 可预览 可删除

效果图&#xff1a; common.js /*** 预览图片*/ const previewImage (current,list)>{// 预览图片uni.previewImage({current: current,urls: list}); } /*** 删除图片*/ const removeImage (current,list)>{var photoFilesList list;photoFilesList.splice(curren…

AJAX:宏任务与微任务

异步任务划分为了 宏任务&#xff1a;由浏览器环境执行的异步代码 微任务&#xff1a;由 JS 引擎环境执行的异步代码 宏任务和微任务具体划分&#xff1a; 左边表格是宏任务&#xff0c;右边是微任务 事件循环模型 /*** 目标&#xff1a;阅读并回答打印的执行顺序 */ console…

国内软件外包公司开发流程

当企业发展到一定阶段后&#xff0c;现有市场上通用型的软件往往无法满足自身的业务需求&#xff0c;这就需要企业定制化开发软件系统来满足自身独特的需求。而传统企业往往没有自己的软件研发队伍&#xff0c;在开发软件系统时快速新建团队风险比较高&#xff0c;可以采用外包…

Docker 网络模型:多角度分析容器网络的原理与应用

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

FPGA adrv9002 4收4发板卡,支持NVME SATA EMMC 光口 FMC

板卡采用ADI 射频直采芯片ADRV9002 &#xff0c;支持4收4发支持外部本振 跳频 同时支持4X 10G光口对外传输&#xff0c;FMC扩展 。同时支持4X NVME接口&#xff0c;可以实时流盘&#xff0c;备份一路SAT A接口&#xff0c;板卡同时预留了EMMC&#xff0c;可以PS PL选通访问&…

【Java基础教程】Java学习路线攻略导图 · 上篇 ~

Java学习路线攻略导图 上篇 前言1、入门介绍篇2、程序基础概念篇3、包及访问权限篇4、异常处理篇5、特别篇6、面向对象篇 前言 &#x1f37a;&#x1f37a; 各位读者朋友大家好&#xff01;得益于各位朋友的支持和关注&#xff0c;我的专栏《Java基础教程》 至今已经更新近半&…

浅谈无人机遥感图像拼接与处理方法

遥感&#xff08;RS-Remote Sensing&#xff09;——不接触物体本身&#xff0c;用传感器收集目标物的电磁波信息&#xff0c;经处理、分析后&#xff0c;识别目标物&#xff0c;揭示其几何、物理性质和相互关系及其变化规律的现代科学技术。 换言之&#xff0c;即是“遥远的感…