链表面试题

💓作者简介👏:在校大二迷茫大学生

💖个人主页🎉:小李很执着

💗系列专栏:Leetcode经典题

每日分享:其实要过那条马路并不难,就看谁在对面等你❣️❣️❣️

目录

💝1.876. 链表的中间结点

❣️1.题目 

❣️2.解答:快慢指针法

💝2.21. 合并两个有序链表

❣️1.题目

❣️2.解答 :双指针遍历两个链表

💝3.OR36 链表的回文结构

❣️1.题目

❣️2.解答:快慢指针和链表反转

💝4.138.随机链表的复制

❣️ 1.题目:

❣️2.解答


💝1.876. 链表的中间结点

876. 链表的中间结点icon-default.png?t=N7T8https://leetcode.cn/problems/middle-of-the-linked-list/

❣️1.题目 

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:


输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。
示例 2:


输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

提示:

链表的结点数范围是 [1, 100]
1 <= Node.val <= 100

❣️2.解答:快慢指针法

算法思路:

使用快慢指针,快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针正好到达中间位置。

具体实现:

首先定义两个指针 slow 和 fast 都指向链表头节点 head。然后使用 while 循环遍历链表,当快指针 fast 到达链表的末尾或者为空时,遍历结束。在循环过程中,每次快指针移动两步,慢指针移动一步。最终返回慢指针 slow,即为链表的中间节点。

遍历两遍:

第一遍:求出链表的长度

第二遍:长度/2

struct ListNode*middleNode(struct ListNode* head)
{
struct ListNode*slow =head,*fast =head;
while(fast &&fast->next)
{
slow =slow->next;
fast =fast->next->next;
}
return slow;
}

💝2.21. 合并两个有序链表

21. 合并两个有序链表icon-default.png?t=N7T8https://leetcode.cn/problems/merge-two-sorted-lists/

❣️1.题目

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列

❣️2.解答 :双指针遍历两个链表

通过使用双指针遍历两个链表,将较小的节点依次加入新链表中。具体实现步骤如下:

  1. 首先判断两个链表中是否有空链表,若有则直接返回不为空的链表。

  2. 定义一个新链表的头指针head和尾指针tail,初始值均为NULL。

  3. 使用while循环遍历list1和list2,比较当前节点的值大小,将较小的节点添加到新链表中。

  4. 当一个链表遍历完后,将另一个链表中剩余的节点全部添加到新链表的尾部。

  5. 返回新链表的头指针head。

需要注意的是,在添加节点到新链表时需要更新尾指针tail。另外,最后返回的是新链表的头指针head,而不是尾指针tail。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{
if(list1==NULL)
return list2;

if(list2==NULL)
return list1;
struct ListNode* tail = NULL,*head = NULL;
while(list1 && list2)
{
if(list1->val < list2->val)
{
if(tail == NULL)
{
head = tail = list1;
}
else
{
tail->next = list1;
tail = tail->next;
}
list1 = list1->next;
}
else
{
if(tail == NULL)
{
head = tail = list2;
}
else
{
tail->next = list2;
tail = tail->next;
}
list2 = list2->next;
}
}
if(list1)
tail->next = list1;
if(list2)tail->next = list2;
return head;  
}

💝3.OR36 链表的回文结构

❣️1.题目

描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例:
1->2->2->1
返回:true

❣️2.解答:快慢指针和链表反转

具体思路如下:

  1. 使用快慢指针找到链表的中间节点,如果链表长度是奇数,则中间节点是正中间的那个节点,如果长度是偶数,则中间节点是偏右的那个节点。

  2. 将链表的后半部分进行反转操作。

  3. 分别从链表头和反转后的链表头开始向中间遍历,比较每个节点的值是否相等,如果有不相等的则说明不是回文链表。

  4. 如果整个链表都遍历完了并且每个节点的值都相等,则说明是回文链表。

代码中定义了三个函数:

  1. reverseList:链表反转函数,输入一个链表头节点,返回反转后的链表头节点。

  2. middleNode:快慢指针找中间节点函数,输入链表头节点,返回中间节点。

  3. chkPalindrome:判断是否为回文链表的函数,输入链表头节点,返回是否为回文链表。

class PalindromeList {
public:
struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* cur = head;
    struct ListNode* newhead = NULL;
    while (cur) {
        struct ListNode* next = cur->next;// 头插
        cur->next = newhead;
        newhead = cur;
        cur = next;
    }
    return newhead;
}
struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode* slow = head, *fast = head;
    while (fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}
bool chkPalindrome(ListNode* head) {
    struct ListNode* mid = middleNode(head);
    struct ListNode* rhead = reverseList(mid);
    while (head && rhead) {
        if (head->val != rhead->val)
            return false;
        head = head->next;
        rhead = rhead->next;
    }
    return true;
}

    
};

💝4.138.随机链表的复制

138. 随机链表的复制icon-default.png?t=N7T8https://leetcode.cn/problems/copy-list-with-random-pointer/

❣️ 1.题目:

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码  接受原链表的头节点 head 作为传入参数。

示例 1:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

提示:

  • 0 <= n <= 1000
  • -104 <= Node.val <= 104
  • Node.random 为 null 或指向链表中的节点。

❣️2.解答

  1. 在原链表中每个节点的后面插入一个新的节点,新节点的值等于原节点的值,新节点的 next 指针等于原节点的 next 指针。

  2. 复制随机指针:对于原链表中的每个节点 cur,将其新节点 copy 的随机指针指向原节点 cur 的随机指针指向节点的下一个节点。

  3. 分离新旧链表:将新链表的头结点和尾结点初始化为 NULL,然后遍历原链表中的每个节点 cur,将 cur 的新节点 copy 从原链表中分离出来,加入到新链表的尾部。最后,将原链表和新链表断开连接,并将新链表的头结点作为结果返回。

该方法的时间复杂度为 O(n),其中 n 是链表中节点的个数。空间复杂度为 O(n),需要额外的空间存储每个节点的复制品。

struct Node* copyRandomList(struct Node* head) {
    struct Node* cur = head;
    while(cur)
    {
      struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
      copy->val = cur->val;
      copy->next = cur->next;
      cur->next = copy;
//cur = copy->next;
      cur = cur->next->next;
    }
cur = head;
while(cur)
{
struct Node* copy = cur->next;
if(cur->random == NULL)
{
copy->random = NULL;
}
else
{
copy->random = cur->random->next;
}
//cur = copy->next;
cur = cur->next->next;
}
struct Node* newhead = NULL,*tail = NULL;
cur = head;
while(cur)
{
struct Node* copy = cur->next;
struct Node* next = copy->next;
if(tail == NULL)
{
newhead = tail = copy;
}
else
{
tail->next = copy;
tail = tail->next;
}
cur->next = next;
cur = next;
}
return newhead;
	
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库约束

目录 数据库约束 1.NULL约束 2.UNIQUE&#xff1a;唯一约束 3.DEFAULT&#xff1a;默认值约束 4.PRIMARY KEY&#xff1a;主键约束 5.FOREIGN KEY&#xff1a;外键约束 数据库约束 以下为本篇文章会介绍的约束 (1)NOT NULL - 指示某列不能存储 NULL 值。 (2)UNIQUE - …

Spark SQL编程

1. Spark SQL概述 1.1 什么是Spark SQL Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同&#xff0c;Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部&#xff0c;Spark SQL使用这些额外的信息来执行额外的优化。与Spa…

qt+opengl 着色器VAO、VBO、EBO(四)

文章目录 一、顶点着色器和片段着色器代码分析1. 着色器12. 顶点着色器2 二、使用步骤1. 使用着色器12. 使用着色器23. 在着色器2中使用EBO 三、完整代码 一、顶点着色器和片段着色器代码分析 1. 着色器1 用到的坐标矩阵, 四个四边形顶点坐标 float vertices_data[36] {// 所…

PlantUML基础使用教程

环境搭建 IDEA插件下载 打开IEDA系列IDE&#xff0c;从FIle–>Settings–>Plugins–>Marketplace 进入到插件下载界面&#xff0c;搜索PlantUML&#xff0c;安装PlantUML Integration和PlantUML Parser两个插件&#xff0c;并重启IDE 安装和配置Graphviz 进入官网…

C/C++轻量级并发TCP服务器框架Zinx-框架开发001: 读取标准输入,回显到标准输出

文章目录 完整代码实现参考-非项目使用项目使用的代码 - 乱-但是思路与上面的相同创建Kernel类添加删除修改epoll&#xff0c;才能写run方法创建stdin_Channel类在Kernel类中实现run方法 完整代码实现参考-非项目使用 #include <errno.h> #include <signal.h> #in…

蓝桥杯每日一题2023.11.14

题目描述 题目分析 此题目的最终目标是将字母都填上数使等式符合条件&#xff0c;实际我们发现可以使用搜索将所有符合条件的进行判断&#xff08;答案&#xff1a;29&#xff09; 由于小数可能会出现错误故我们将其进行简单变化进行搜索 #include<bits/stdc.h> using…

No207.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Pytorch自动混合精度的计算:torch.cuda.amp.autocast

1 autocast介绍 1.1 什么是AMP? 默认情况下&#xff0c;大多数深度学习框架都采用32位浮点算法进行训练。2017年&#xff0c;NVIDIA研究了一种用于混合精度训练的方法&#xff0c;该方法在训练网络时将单精度&#xff08;FP32&#xff09;与半精度(FP16)结合在一起&#xff…

Dart利用私有构造函数_()创建单例模式

文章目录 类的构造函数_()函数dart中构造函数定义 类的构造函数 类的构造函数有两种&#xff1a; 1&#xff09;默认构造函数&#xff1a; 当实例化对象的时候&#xff0c;会自动调用的函数&#xff0c;构造函数的名称和类的名称相同&#xff0c;在一个类中默认构造函数只能由…

post 和get参数 请求

json参数 post请求格式 RestController public class HelloController { //json参数 post 请求RequestMapping("/jsonParam")public String jsonParam(RequestBody User user){System.out.println(user);return "OK";} } postman 接口测试工具…

spring cloud alibaba 简介

微服务搭建组件选型 1.服务注册中心 Nacos(spring-cloud-alibaba) 2.服务通信 OpenFeign(spring-cloud) 3.服务熔断、降级、限流 Sentinel(spring-cloud-alibaba) 4.网关 Gateway(spring-cloud) 5.服务配置中心 …

MySQL被攻击后创建数据库报错1044 - Access denied for user ‘root‘@‘%‘ to database ‘xxx‘

MySQL被攻击后创建数据库报错1044 - Access denied for user root% to database xxx 一、问题二、解决过程1、正常过程2、踩坑&#xff08;已经解决问题的可以不看&#xff09; 一、问题 最近数据库被攻击了&#xff0c;业务数据库都没了 还好也不是有重要数据&#xff0c;但再…

【HUST】网安纳米|2023年研究生纳米技术考试参考

目录 1 纳米材料是什么 2 纳米材料的结构特性 3 纳米结构的其他特性 4 纳米结构的检测技术 5 纳米材料的应用 打印建议&#xff1a;PPT彩印&#xff08;这样重点比较突出&#xff09;&#xff0c;每面12张PPT&#xff0c;简单做一下关键词目录&#xff0c;亲测可以看清。如…

Uniapp开发 购物商城源码 在线电商商城源码 适配移动终端项目及各小程序

lilishop电商商城系统 商城移动端&#xff0c;使用Uniapp开发&#xff0c;可编译为所有移动终端项目及各小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88487579 源码下载2&#xff1a;关注我留言

02 # 类型基础:强类型与弱类型

宽泛的定义 在强类型语言中&#xff0c;当一个对象从调用函数传递到被调用函数时&#xff0c;其类型必须与被调用函数中声明的类型兼容 – Liskov, Zilles 1974 通俗定义 强类型语言不允许改变变量的数据类型&#xff0c;除非进行强制类型转换 比如下面 Java 里不能将布尔类…

最小二乘法及参数辨识

文章目录 一、最小二乘法1.1 定义1.2 SISO系统运用最小二乘估计进行辨识1.3 几何解释1.4 最小二乘法性质 二、加权最小二乘法三、递推最小二乘法四、增广最小二乘法 一、最小二乘法 1.1 定义 1974年高斯提出的最小二乘法的基本原理是未知量的最可能值是使各项实际观测值和计算…

〖大前端 - 基础入门三大核心之JS篇㉟〗- JavaScript 的DOM简介

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

基于Python实现汽车销售数据可视化【500010086】

导入模块 import numpy as np import pandas as pd import plotly.graph_objects as go import plotly.express as px获取数据 df1 pd.read_excel(r"./data/中国汽车总体销量.xlsx") print(df1.head(5))df1.info()df1[年份] df1[时间].dt.year df1[月份] df1[时…

科研学习|科研软件——有序多分类Logistic回归的SPSS教程!

一、问题与数据 研究者想调查人们对“本国税收过高”的赞同程度&#xff1a;Strongly Disagree——非常不同意&#xff0c;用“0”表示&#xff1b;Disagree——不同意&#xff0c;用“1”表示&#xff1b;Agree--同意&#xff0c;用“2”表示&#xff1b;Strongly Agree--非常…

【VBA】基于EXCEL生成Insert语句工具

工具介绍 基于Excel生成INSERT语句工具是一个辅助工具&#xff0c;用于帮助用户根据Excel数据生成INSERT语句。通常&#xff0c;在数据库中插入大量数据时&#xff0c;手动编写INSERT语句会非常繁琐和耗时。而使用这个工具&#xff0c;可以通过Excel中的数据自动生成相应的INS…