链表中倒数第k个结点、反转链表、合并两个排序的链表、树的子结构、删除链表中重复的结点

news2025/7/9 17:09:08

文章目录

  • 1、链表中倒数第k个结点
  • 2、反转链表
  • 3、合并两个排序的链表
  • 4、树的子结构
  • 5、 二叉树的镜像
  • 6、删除链表中重复的结点

1、链表中倒数第k个结点

本题考点: 链表,前后指针的使用,边界条件检测 牛客链接

题目描述:
输入一个链表,输出该链表中倒数第k个结点。
示例1
输入:1,{1,2,3,4,5}
返回值:{5}

解题思路:

在这里插入图片描述
代码:

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
		if(nullptr == pListHead)
			return nullptr;

		ListNode* fast = pListHead;
		ListNode* slow = pListHead;
		while(k > 0 && fast) //k值有可能不合法
		{
			fast = fast->next;
			k--;
		}

		while(fast)
		{
			fast = fast->next;
			slow = slow->next;
		}
		return k > 0 ? nullptr : slow;
    }
};

2、反转链表

本题考点: 链表 牛客链接

题目描述:
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

数据范围: 0≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度O(n) 。

如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

解题思路:

在这里插入图片描述
代码:

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {

		//三指针法
		if(nullptr == pHead || pHead ->next == nullptr)
			return pHead;
		
		ListNode* prev = nullptr, *cur = pHead, *last = cur->next;
		while(last)
		{
			cur->next = prev;
			prev = cur;
			cur = last;
			last = last->next;
		}
		cur->next = prev;
		return cur;

		// //头插法

		// if(pHead == nullptr || pHead->next == nullptr)
		// 	return pHead;

		// ListNode* new_head = nullptr;
		// ListNode* cur = pHead;
		// while(cur)
		// {
		// 	ListNode* temp = cur;
		// 	cur = cur->next;

		// 	temp->next = new_head;
		// 	new_head = temp;
		// }

		// return new_head;
    }
};

3、合并两个排序的链表

本题考点: 链表合并 牛客链接

题目描述:

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围:0≤n≤1000,−1000≤节点值≤1000
要求:空间复杂度O(1),时间复杂度 O(n)

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
在这里插入图片描述

解题思路:

在这里插入图片描述

代码:

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        //方法一:
		if(pHead1 == nullptr)
			return pHead2;
		if(pHead2 == nullptr)
			return pHead1;
		
		//带头
		ListNode* newHead = new ListNode(0);
		ListNode* newTail = newHead;

		while(pHead1 && pHead2)
		{
			newTail->next = pHead1->val < pHead2->val ? pHead1 : pHead2;
			newTail = newTail->next;
				
			if(newTail == pHead1)
				pHead1 = pHead1->next;
			else
				pHead2 = pHead2->next;
		}
		if(pHead1 == nullptr)
			newTail->next = pHead2;
		if(pHead2 == nullptr)
			newTail->next = pHead1;

		return newHead->next;
	}
		ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
		//方法二:迭代
		//划分成子问题,也就是每一次找一个其中小的节点,然后递归链接

		//返回条件
		if(pHead1 == nullptr)
			return pHead2;
		if(pHead2 == nullptr)
			return pHead1;
		
		ListNode* newHead = nullptr;

		if(pHead1->val < pHead2->val)
		{
			newHead = pHead1;
			pHead1 = pHead1->next;
		}
		else
		{
			newHead = pHead2;
			pHead2 = pHead2->next;
		}

		newHead->next = Merge(pHead1, pHead2);

		return newHead;
    }
};

4、树的子结构

本题考点: 二叉树理解,二叉树遍历 牛客链接

题目描述:

输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构

在这里插入图片描述代码:

class Solution {
public:
	bool isSame(TreeNode* root, TreeNode* subRoot)
	{
		if(subRoot == nullptr)
			return true;
		
		if(root == nullptr)
			return false;

		if(root->val != subRoot->val)
			return false;


		return isSame(root->left, subRoot->left) && isSame(root->right, subRoot->right);

	}
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
		if(pRoot1 == nullptr || pRoot2 == nullptr)
			return false;
		
		if(isSame(pRoot1, pRoot2))
			return true;
		
		return HasSubtree(pRoot1->right, pRoot2) || HasSubtree(pRoot1->left, pRoot2);

    }
};

5、 二叉树的镜像

本题考点: 二叉树操作 牛客链接

题目描述:
操作给定的二叉树,将其变换为源二叉树的镜像。
数据范围:二叉树的节点数 0≤n≤1000 , 二叉树每个节点的值 0≤val≤1000
要求: 空间复杂度 O(n) 。本题也有原地操作,即空间复杂度 O(1) 的解法,时间复杂度 O(n)

比如:
在这里插入图片描述
解题思路:

在这里插入图片描述
代码:

class Solution {
public:

    TreeNode* Mirror(TreeNode* pRoot) {
        
        if(pRoot == nullptr)
            return nullptr;
        
        TreeNode* temp = pRoot->left;
        pRoot->left = pRoot->right;
        pRoot->right = temp;

        Mirror(pRoot->left);
        Mirror(pRoot->right);

        return pRoot;
    }

};

6、删除链表中重复的结点

本题考点: 链表操作,临界条件检查,特殊情况处理 牛客链接

题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5

数据范围:链表长度满足 0≤n≤1000 ,链表中的值满足 1≤val≤1000

进阶:空间复杂度 O(n) ,时间复杂度 O(n)

解题思路:

在这里插入图片描述

代码:

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {

        if(pHead == nullptr || pHead->next == nullptr)
            return pHead;
        
        //带头结点
        ListNode* newHead = new ListNode(0);
        newHead->next = pHead;

        ListNode* prev = newHead;
        ListNode* last = prev->next;

        while(last)
        {
            //1、确立重复区域起始位置
            while(last->next != nullptr && last->val != last->next->val)
            {
                prev = last;
                last = last->next;
            }

            //2、确立重复区域
            while(last->next != nullptr && last->val == last->next->val)
            {
                last = last->next;
            }

            //1.last->next != nullptr , prev, last 确定一段范围, prev->next = last->next
            //2.last->next == nullptr , prev, last 确定一段范围, prev->next = last->next
            //3.last->next == nullptr , 链表没有重复节点

            if(prev->next != last)  //只处理有重复节点情况
                prev->next = last ->next;

            last =last->next;
        }
        return newHead->next;
    }
};

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

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

相关文章

JVM【八股文】

JVM【八股文】 JVM内存区域划分 程序计数器栈堆方法区 一块大的区域&#xff0c;需要根据功能&#xff0c;来划分不同的小区域。 JVM内存是从操作系统里申请来的&#xff0c;之后堆这部分区域进行了划分。 1.程序计数器 内存中最小的区域&#xff0c;保存了下一条要执行指令…

android-加壳加固

title: android-加壳加固 categories: Android tags: [android, 加壳, 加固, 混淆] date: 2022-06-20 18:00:23 comments: false mathjax: true toc: true android-加壳 前篇 Android之Apk加壳 - https://blog.csdn.net/LVXIANGAN/article/details/84956476Android动态加载Dex…

李沐论文精度系列之七:Two-Stream双流网络、I3D

文章目录一、双流网络1.1 前言1.2 网络结构1.3 光流(Optical flow)1.3.1 什么是光流1.3.2 如何利用光流1.3.3 双向光流&#xff08;Bi-directional optical flow&#xff09;1.3.4 光流的局限性及和对应的预处理&#xff08;抽取&#xff09;方式1.3.5 视频模型测试1.4 实验1.4…

✿✿✿JavaScript基本语法一

目 录 1.js的发展史&#xff08;闲聊版&#xff09; 2.浏览器分成两部分&#xff1a;渲染引擎和 JS 引擎 3.js与html的关系以及结合方式 (1)js与html的关系 (2)js与html结合方式 4.JavaScript注释 5.js中的基本数据类型 6.js中的变量 7.运算符&#xff08;自动类型转…

9.前端笔记-CSS-盒子模型-border和padding

页面布局的三大核心&#xff1a; 盒子模型浮动定位 1、盒子模型 1.1 盒子模型组成 盒子模型本质还是一个盒子&#xff0c;包括边框border、外边距margin、内边距padding和实际内容content 1.1.1 边框border 组成 组成&#xff1a;颜色border-color、边框宽度border-wid…

518. 零钱兑换 II【完全背包:求组合数】

518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位…

C++11 右值,右值引用,移动构造,移动赋值

目录 一、左值&#xff0c;左值引用&#xff0c;右值&#xff0c;右值引用的相关概念&#xff1a; 1. 什么是左值&#xff0c;什么是左值引用&#xff1f; 2. 什么是右值&#xff0c;什么是右值引用&#xff1f; 3. 右值的属性是右值&#xff0c;右值引用的属性是左值 4. …

棒子老虎鸡-第12届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第86讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

研究生有限元仿真应用中存在的问题与对策

作者&#xff1a;尚晓江 导读&#xff1a;有限元分析软件作为计算工具&#xff0c;在科研和工程领域都有广泛应用&#xff0c;而多数用户是在研究生阶段开始接触和使用这些计算软件的。本文以ANSYS结构分析为例&#xff0c;对现阶段研究生应用有限元分析软件的现状和存在的问题…

无人机设计仿真--在Isight平台上进行的基于CST参数化+Xfoil的无人机翼型优化

作者&#xff1a;Graychen 一、工程背景 翼型的选型和设计是飞行器气动设计中的一项基础性工作&#xff0c;翼型对飞行器的气动性能具有根本性的影响。现在高性能飞行器已不再从翼型库中选择适用翼型后直接使用&#xff0c;而是以现有翼型作为基准翼型进行气动优化&#xff…

java基本语法 下

目录 运算符 运算符&#xff1a;算术运算符 运算符&#xff1a;赋值运算符 运算符&#xff1a;比较运算符 运算符&#xff1a;逻辑运算符 运算符&#xff1a;三元运算符 运算符的优先级 程序流程控制 概念 顺序结构 if-else结构 switch-case结构 循环结构 循环结构…

Unity视差贴图多实现对比和改进

视差贴图多种实现方式对比和改进视差贴图视差映射陡峭视差映射视差遮蔽映射迭代视差映射-kerry视差贴图 参考 与法线贴图相同&#xff0c;可以模拟出物体得深度感&#xff0c;同时它得改进是能够随着视角得偏移显示不同得深度感&#xff0c;使得显示更加真实。 由于采样高度…

代码随想录刷题| 多重背包理论基础、背包问题的总结

目录 多重背包理论基础 多重背包的问题 多重背包的解法 多重背包的代码 背包问题的总结 01背包 完全背包 多重背包 多重背包理论基础 多重背包的问题 有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用&#xff0c;每件耗费的空间是Ci &#xff0c;价值是Wi 。…

单身福利专场, Python采集某相亲网站美女数据

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 现在&#xff0c;广大年轻人到了一定年纪&#xff0c;一定会引来父母的念叨 不是让相亲就是让结婚的&#xff0c;与其父母念叨&#xff0c;不如自己找一个 到时候问起来&#xff0c;就说再接触呢~~ 今天我们就来用python…

NestJS学习:使用session实现登录验证

参考 大佬的视频教程&#xff1a;nestjs session案例 大佬的博客地址&#xff1a;小满nestjs&#xff08;第九章 nestjs Session&#xff09; 在学习某些知识时如果有大佬的视频教程与文档真的是太爽了&#xff0c;能够学习到好多新知识。 nest后台 session session 是服务…

目标检测算法——3D公共数据集汇总(附下载链接)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f680;&#x1f680;&#x1f680;近期&#xff0c;小海带在空闲之余&#xff0c;收集整理了一批3D公共数据集供大家参考。 整理不易&#xff0c;小伙伴们记得一键三连喔&#xff01;&#xff01;&…

十个值得珍藏的正则表达式

正则表达式常学常忘&#xff0c;记规则不如记例子&#xff0c;记多不如记精&#xff0c;记例子就记最经典的。下面是本人珍藏的十个有用的正则表达式&#xff0c;不吝分享&#xff0c;以飨读者。 正则表达式要点 小括号&#xff1a;代表分组 中括号&#xff1a;代表集合 大括号…

回归分析(1)-回归分析的基本概念

1.回归方程 由于x是可控的非随机变量&#xff0c; 而Y 是一个与x有关的随机变量&#xff0c;因此&#xff0c;直接研究变量Y与x之间的相关关系是困难的&#xff0e; 如果注意到随机变量Y的数学期望反映了随机变量Y的平均取值&#xff0c;因此&#xff0c; 可考虑研究EY与x之间的…

第六章 支持向量机

6.1 间隔与支持向量 给定一个训练样本集&#xff0c;分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面。但是这个划分超平面也是很多的&#xff0c;如下图所示 直观上应该去找两类样本中最中间的划分超平面&#xff0c;因为该划分超平面对训练样本局部扰动…

与分类有关的一种时序优先现象

(A&#xff0c;B)---2*30*2---(1,0)(0,1) 用网络分类A和B&#xff0c;让A由两张图片组成&#xff08;0&#xff0c;0&#xff09;&#xff08;0&#xff0c;1&#xff09;&#xff0c;让B由两张图片组成&#xff08;1&#xff0c;0&#xff09;&#xff08;0&#xff0c;0&…