LeetCode:经典题之876、143 题解及延伸

系列目录

88.合并两个有序数组
52.螺旋数组
567.字符串的排列
643.子数组最大平均数
150.逆波兰表达式
61.旋转链表
160.相交链表
83.删除排序链表中的重复元素
389.找不同
1491.去掉最低工资和最高工资后的工资平均值
896.单调序列
206.反转链表
92.反转链表II
141.环形链表
142.环型链表
21.合并两个有序列表
24.两辆交换链表中的节点
876.链表的中间节点
143. 重排链表
2.两数相加
445.两数相加II


目录

  • 系列目录
  • 876. 链表的中间节点
    • 线性表
  • 143. 重排链表
    • push_back()与emplace_back()
      • push_back()
      • emplace_back()


876. 链表的中间节点

🌟线性表/动态数组+快慢指针

原题链接


C++
若未特殊标明,以下题解均写用C++

方法一 快慢指针
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* middleNode(ListNode* head) {ListNode *slow = head, *fast = head;// 记得一定要先对fast 进行检查while (fast != nullptr && fast->next != nullptr) {slow = slow->next;fast = fast->next->next;}return slow;}
};

先检查 fast 是为了确保在尝试访问 fast->next 之前,fast 不是 nullptr,从而避免未定义行为


方法二 线性表/动态数组
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* middleNode(ListNode* head) {// 定义一个类似于数组特性的线性表——支持下标访问vector<ListNode*> a = {head};// a.back()取原线性表的最后一个元素while (a.back()->next != nullptr)a.push_back(a.back()->next);// C++ 默认向下取整return a[a.size() / 2];}
};

注解:

vector<ListNode*> a = {head};

vector的元素为链表的节点ListNode*——这也是我们为什么使用nullptr的原因
并创建一个包含单个元素(即head指针)的vector

若没有{head},则定义的是一个空的容器vector


线性表

定义

  • 线性表(Linear List)是数据结构的一种,它是一个具有相同特性的数据元素的有限序列
  • 数据元素之间的关系是一对一的,即除了第一个和最后一个数据元素之外,其他数据元素都是首尾相接的
  • 线性表的个数n定义为线性表的长度,n=0时称为空表

性质

  1. 集合中必存在唯一的一个“第一元素”:线性表有明确的起始点
  2. 集合中必存在唯一的一个“最后元素”:线性表有明确的终止点
  3. 除最后一个元素之外,均有唯一的后继(后件):除了最后一个元素,每个元素后面都跟着一个元素
  4. 除第一个元素之外,均有唯一的前驱(前件):除了第一个元素,每个元素前面都有一个元素
  5. 线性表能够逐项访问和顺序存取:可以按照元素的顺序进行访问和存储(类似数组)

分类

  • 一般线性表:可以自由地进行删除或添加操作
  • 受限线性表:主要包括栈(后进先出)和队列(先进先出),对结点的操作有限制

基本操作

  1. MakeEmpty(L):将L变为空表
  2. Length(L):返回表L的长度,即表中元素个数
  3. Get(L, i):返回L中位置i处的元素(1≤i≤n)
  4. Prior(L, i):取i的前驱元素
  5. Next(L, i):取i的后继元素
  6. Locate(L, x):返回元素x在L中的位置
  7. Insert(L, i, x):在表L的位置i处插入元素x,将原占据位置i的元素及后面的元素都向后推一个位置
  8. Delete(L, p):从表L中删除位置p处的元素
  9. IsEmpty(L):判断L是否为空表

应用场景

  • 通讯录管理:每个联系人作为线性表的一个元素,包含姓名、电话号码、地址等属性
  • 缓存替换算法:如最近最少使用算法(LRU)和先进先出算法(FIFO),使用线性表结构便于对缓存中的数据进行插入、删除和查找操作
  • 任务调度系统:将需要执行的任务按照一定的优先级顺序存储在线性表中
  • 计算机图形学:顶点表用于存储图形模型的顶点信息,每个元素表示一个顶点
  • 公交线路查询系统:线路信息可以用线性表来存储,每个线路作为线性表的一个元素

优点

  • 逻辑结构简单,便于实现和操作
  • 广泛应用于各种实际场景中,是数据处理和存储的基础结构之一





143. 重排链表

🌟线性表/动态数组

原题链接


C++
若未特殊标明,以下题解均写用C++

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:void reorderList(ListNode* head) {// 特况if (head == nullptr) return;// 定义一个空线性表 Linear Listvector<ListNode*> LL;ListNode* node = head;// 将 链表节点 存入 线性表中while (node != nullptr) {LL.emplace_back(node);node = node->next;}// 下标从0开始int i = 0, j = LL.size() - 1;while (i < j) {// 像数组一样 可用下标访问LL[i]->next = LL[j];i ++;// 如LL.size() = 2,提前结束循环if (i == j)break;LL[j]->next = LL[i];// 用完 j 再更新j --;}// 最后别忘了 指向空LL[i]->next = nullptr;}
};

push_back()与emplace_back()

push_back()

push_backstd::vector 的一个成员函数,用于在容器的末尾添加一个元素
使用 push_back 时,你需要提供一个与容器内元素类型相同的对象(或者一个可以隐式转换为该类型的对象) 这个对象会被复制(如果类型支持复制)或移动(如果类型支持移动并且提供了右值引用)到容器的末尾

示例:

#include <vector>  
#include <string>  int main() {  std::vector<std::string> vec;  // 使用 push_back 添加一个字符串  std::string str = "Hello";  vec.push_back(str); // 这里可能发生复制或移动操作  // 也可以直接使用临时对象  vec.push_back(std::string("World")); // 这里一定会发生复制操作(因为我们是用一个右值来初始化一个临时对象)  return 0;  
}

在上面的例子中,当你使用 push_back 并传递一个 std::string 对象时,如果 str 是一个左值(即具有持久身份的对象),那么它可能会被复制或移动(取决于 std::string 的实现和编译器优化) 如果你传递一个右值(如临时对象),那么通常会发生复制操作,因为右值通常不被视为可移动的对象(尽管在某些情况下,编译器可能会进行优化以消除不必要的复制)


emplace_back()

emplace_back 是 C++11 引入的一个成员函数,旨在提供比 push_back 更高的性能 与 push_back 不同,emplace_back 允许你直接在容器的末尾构造一个元素,而不是先创建一个对象然后将其复制或移动到容器中
这通常可以避免不必要的复制或移动操作,尤其是在处理大型或复杂的对象时,能够提升一定的性能

emplace_back 接受与要构造的对象构造函数相同的参数,并在容器的末尾直接调用该构造函数

示例:

#include <vector>  
#include <string>  int main() {  std::vector<std::string> vec;  // 使用 emplace_back 直接在容器末尾构造一个字符串  vec.emplace_back("Hello"); // 直接在vec的末尾构造一个std::string对象,没有复制或移动  // 也可以传递多个参数给构造函数  vec.emplace_back(5, 'a'); // 构造一个包含5个'a'字符的std::string对象  return 0;  
}

在上面的例子中,emplace_back 直接在 vec 的末尾构造了一个 std::string 对象,没有涉及任何复制或移动操作
这通常比使用 push_back 并传递一个临时对象更高效

总结:

push_backemplace_back 都可在 vector 的末尾添加元素

  • 当对象的构造过程涉及多个参数或复杂逻辑时,更推荐使用emplace_back()
    🉑直接在容器中构造元素来避免不必要的复制或移动操作
  • 当元素类型支持移动语义且移动操作比复制操作更快时,更推荐使用push_back()
  • 但也不必过于纠结,对比着将二者都记下并熟练使用就好啦

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

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

相关文章

pdfmake不能设置表格边框颜色?

找到pdfmake>build>pdfmake.js中&#xff1a; 找到定义的“TableProcessor.prototype.drawVerticalLine”和“TableProcessor.prototype.drawHorizontalLine”两个方法&#xff1a; 重新定义borderColor: var borderColor this.tableNode.table.borderColor||"#…

Python:探索高效、智能的指纹识别技术(简单易懂)

目录 概括 导入库 函数一 参数&#xff1a; 函数二 函数三 主函数 运行结果 src&#xff1a; model_base 7.bmp ​编辑 总结 概括 指纹识别是一种基于人体生物特征的身份验证技术。它通过捕捉和分析手指上的独特纹路和细节特征&#xff0c;实现高准确度的身份识别。…

【工具测评】ONLYOFFICE8.1版本桌面编辑器测评:好用!

随着远程工作的普及和数字化办公的发展&#xff0c;越来越多的人开始寻找功能强大、易于使用的办公软件。在这个背景下&#xff0c;ONLYOFFICE 8.1应运而生&#xff0c;成为许多用户的新选择。ONLYOFFICE 8.1是一款办公套件软件&#xff0c;提供文档处理、电子表格和幻灯片制作…

动手学深度学习(Pytorch版)代码实践 -计算机视觉-41目标检测数据集

41目标检测数据集 import os import pandas as pd import torch import torchvision import matplotlib.pylab as plt from d2l import torch as d2l# 数据集下载链接 # http://d2l-data.s3-accelerate.amazonaws.com/banana-detection.zip# 读取数据集 #save def read_data_b…

6.28U-Net深度学习基准模型特点与应用

U-Net深度学习基准模型特点与应用 U-Net是一种在深度学习领域广泛应用于图像分割任务的卷积神经网络&#xff08;CNN&#xff09;模型&#xff0c;最初由Olaf Ronneberger、Philipp Fischer和Thomas Brox在2015年的论文《U-Net: Convolutional Networks for Biomedical Image …

右键新建没有TXT文本文档的解决办法

电脑右键新建&#xff0c;发现没有txt了&#xff0c;我查网上办法都有点复杂&#xff0c;诸如注册表的&#xff0c;但是其实很简单&#xff0c;重启windows资源管理器就可以了。 点击重新启动&#xff0c;之后新建就有txt文档了。

C++20中的Feature Test Mocros

C20定义了一组预处理器宏&#xff0c;用于测试各种语言和库的feature。 Feature Test Mocros(特性测试宏)是C20中引入的一种强大机制&#xff0c;用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现&#xff0c;它使你能够在编译过程中仔细…

区块链的优势与挑战:为什么区块链如此重要?

区块链听起来像是一种高科技的魔法&#xff0c;很多人都想知道它到底是怎么回事&#xff0c;为什么会引起如此大的关注。今天&#xff0c;我们就来揭开区块链的神秘面纱&#xff0c;看看它的优势和挑战&#xff0c;顺便聊聊为什么它会变得如此重要。 优势篇 1. 去中心化&…

流水线作业模拟程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 流水线作业模拟 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private int Count 0;private bool IsStop false;private void uiLight1_Click(object sender, EventArgs e…

[MYSQL] MYSQL库的操作

前言 本文主要介绍MYSQL里 库 的操作 请注意 : 在MYSQL中,命令行是不区分大小写的 1.创建库 create database [if not exists] database_name [charsetutf8 collateutf8_general_ci] ...] create database 是命名语法,不可省略[if not exists] 如果不存在创建,如果存在跳过…

GESP 四级急救包(2):客观题真题集

客观题真题集 一、选择题1. 真题梳理2. 真题答案3. 重难点点播(1) 指针和地址(2) 时间复杂度 二、判断题1. 真题梳理2. 真题答案 一、选择题 1. 真题梳理 若函数声明为 void f(int &a, int b, const int &c)&#xff0c;且在主函数内已经声明了 x , y , z x,y,z x,y,…

最新Node.js安装及配置详细教程

文章目录 下载Node.js安装Node.js配置Node.js1、修改npm包的全局安装路径和缓存路径2、环境变量设置3、镜像源配置4、安装其他包管理工具 下载Node.js 下载&#xff1a;https://nodejs.org/en/download/prebuilt-installer&#xff0c;下载LTS版本的&#xff0c;LTS(Long Time…

代码随想录算法训练营day67 | 110.字符串接龙、105. 有向图的完全可达性、106. 岛屿的周长

本次题目全部来自卡码网 110.字符串接龙 本题只需要求出最短路径的长度就可以了&#xff0c;不用找出具体路径。 所以这道题要解决两个问题&#xff1a; 图中的线是如何连在一起的起点和终点的最短路径长度 首先题目中并没有给出点与点之间的连线&#xff0c;而是要我们自…

驼峰命名法在编程中的应用

驼峰命名法在编程中的应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;驼峰命名法&#xff08;Camel Case&#xff09;是一种常见的命名约定&#xff0c;在编…

IPython “%%script“ 魔法命令:跨平台脚本执行指南

IPython是一个强大的交互式Python解释器&#xff0c;提供了许多增强功能来提高开发效率。其中&#xff0c;%%script魔法命令是一个非常有用的特性&#xff0c;它允许用户在IPython环境中执行外部脚本。本文将详细介绍%%script命令的使用方法&#xff0c;包括其基本概念、使用场…

前端 JS 经典:函数签名

函数签名是什么&#xff1f;函数签名 函数名 参数 返回类型。 当我们明确了这 3 样东西&#xff0c;那么这个函数的作用和用法就确定了&#xff0c;它内部怎么实现的&#xff0c;我们完全不用管。 如下&#xff0c;我们知道这是一个判断属性是否对象的函数&#xff0c;只需…

SQL 基本语法

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系型数据库的语言。以下是SQL的基本语法&#xff1a; 创建数据库&#xff1a; CREATE DATABASE database_name;使用数据库&#xff1a; USE database_name;创建表&#xff1a; CREATE TABLE table_…

基于多模态知识图谱的多模态推理-MR-MKG

MR-MKG论文中提出了一种新的多模态推理方法&#xff0c;即利用多模态知识图&#xff08;Multimodal Knowledge Graph, MMKG&#xff09;进行多模态推理的方法。这种方法旨在通过从MMKG中学习&#xff0c;扩展大型语言模型&#xff08;LLMs&#xff09;的多模态知识。 1 三个模…

面对.rmallox勒索病毒:如何有效防范及应对

引言&#xff1a; 在当今数字化社会&#xff0c;网络安全问题日益严重&#xff0c;勒索病毒成为企业和个人不可忽视的威胁之一。最近出现的.rmallox勒索病毒更是给全球各地的用户带来了严重的数据安全问题。本文将探讨.rmallox勒索病毒的特点、感染方式及应对策略&#xff0c;…

探索CSS布局:创建一个居中的内嵌方块示例

在网页设计中&#xff0c;布局是至关重要的部分。CSS提供了多种方式来实现元素的布局&#xff0c;包括居中对齐、外边距、内边距等。本文将通过一个简单的示例&#xff0c;介绍如何使用CSS来创建一个居中的内嵌方块&#xff0c;并探讨其背后的布局原理。 HTML 结构 首先&…