当前位置: 首页 > news >正文

【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解

 🎉🎉欢迎光临🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 🚀《数据结构与算法:初学者入门指南》📘📘《Spring 狂野之旅:底层原理高级进阶》 🚀

本专栏纯属为爱发电永久免费!!!

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/

前景回顾:我们用 环形链表的方法巧妙解决了约瑟夫问题  可是链表就到处为止了吗?当然不是  下面带给大家两道我刷过较为经典的算法题  两道面试的真题 一道是tx 一道阿里的

目录

腾讯面试题:复制随机节点

题目说明:

输入示例:

输出示例:

时间复杂度:O(n)

空间复杂度:O(n)

解析

题目分析:

解题过程:

阿里巴巴面试题:合并K个排序链表

题目说明:

输出示例:

时间复杂度:O(N*log(k))

空间复杂度:O(k)

解析

题目分析:

解题过程:


腾讯面试题:复制随机节点

题目说明:

给定一个链表,每个节点包含一个指向任意节点的随机指针,同时每个节点有一个指向同一链表中节点的指针,输出这个链表的深拷贝。

输入示例:
输入:
Node* p = new Node(p1);
p1 = new Node(p2);
p2 = new Node(p3);
p3 = new Node(null);
// 随机连接
p->random = p2;
p1->random = null;
p2->random = p3;Node* clone = cloneRandomNode(p);
输出示例:

返回与原链表相同结构的复制链表,并正确设置每个节点的随机指针。

时间复杂度:O(n)
  • 其中 n 是链表的长度,我们需要遍历整个链表一次来创建复制品。
空间复杂度:O(n)
  • 存储复制的节点需要额外的空间。

解析

题目分析:

这个问题要求我们复制一个链表,其中每个节点包含一个指向任意节点的随机指针。我们需要返回这个链表的深拷贝,并正确设置每个节点的随机指针。

解题过程:
  1. 首先,我们遍历原始链表,对于每个节点,创建一个新节点,并将其插入到原节点的后面。这样我们就可以同时访问原始节点和新节点。例如,原始链表为 1 -> 2 -> 3,复制后变为 1 -> 1' -> 2 -> 2' -> 3 -> 3'

    原始链表:   1 -> 2 -> 3
    复制后的链表: 1' -> 2' -> 3'

  2. 然后,我们再次遍历链表,这次是为了设置每个新节点的随机指针。我们根据原节点的随机指针找到对应的新节点,并将其设置为新节点的随机指针。例如,如果原节点 2 的随机指针指向 3,那么新节点 2' 的随机指针应该指向 3'

    原始链表:   1 -> 2 -> 3
    复制后的链表: 1' -> 2' -> 3'
    随机指针:    N -> 2 -> N
    复制后的随机指针: N -> 2' -> N

  3. 最后,我们将新旧节点分离,并返回复制链表的头节点。例如,将 1 -> 1' -> 2 -> 2' -> 3 -> 3' 分离成 1 -> 2 -> 31' -> 2' -> 3',然后返回 1' 作为复制链表的头节点。

原始链表:   1 -> 2 -> 3
复制后的链表: 1' -> 2' -> 3'
分离后的链表: 1 -> 2 -> 3
分离后的复制链表: 1' -> 2' -> 3'
返回头节点: 1'
class Node:def __init__(self, val=0, next=None, random=None):self.val = valself.next = nextself.random = randomdef cloneRandomNode(head):if not head:return None# 第一步:复制每个节点,并将新节点插入原节点后面curr = headwhile curr:new_node = Node(curr.val)new_node.next = curr.nextcurr.next = new_nodecurr = new_node.next# 第二步:设置每个新节点的随机指针curr = headwhile curr:curr.next.random = curr.random.next if curr.random else Nonecurr = curr.next.next# 第三步:分离新旧节点,返回复制链表的头节点curr = headnew_head = head.nextwhile curr:next_old = curr.nextnext_new = curr.next.nextcurr.next = next_newif next_new:curr.next.next = next_oldcurr = next_oldreturn new_head

阿里巴巴面试题:合并K个排序链表

题目说明:

给你一个链表数组,每个链表都已经按升序排列,请你将所有的链表合并到一个升序链表中,返回合并后的链表。

复制代码
输入:
lists = [[1,4,5],[1,3,4],[2,6]]
 
输出示例:

输出:[1,1,2,3,4,4,5,6]

 
时间复杂度:O(N*log(k))
  • 其中 N 是所有链表中元素的总数,k 是链表的个数。假设使用最小堆处理每个链表的头部元素。
空间复杂度:O(k)
  • 存储 k 个链表头部节点所需的空间。

解析

题目分析:

这个问题要求我们合并 k 个已排序的链表,并返回一个新的升序链表。我们可以使用分治法来解决这个问题。

解题过程:
  1. 我们使用最小堆来存储每个链表的头部节点。这样可以快速地找到当前最小的节点。例如,如果有三个链表分别为 1 -> 4 -> 51 -> 3 -> 42 -> 6,则最小堆中的元素为 (1, node1)(1, node2)(2, node3)

    链表1:       1 -> 4 -> 5
    链表2:       1 -> 3 -> 4
    链表3:       2 -> 6
    最小堆:      (1, node1), (1, node2), (2, node3)
    

  2. 我们创建一个虚拟头节点 dummy,用于连接所有合并后的节点。

  3. 我们不断从最小堆中取出最小的节点,将其连接到结果链表中,并将该节点的下一个节点加入堆中,直到堆为空。例如,我们从最小堆中取出 (1, node1),将其连接到结果链表中,然后将 node1.next(即值为 4 的节点)加入堆中。

    结果链表:     dummy -> 1
    最小堆:      (1, node2), (4, node4), (6, node6)
    

  4. 最后,我们返回合并后链表的头节点。例如,最终的结果链表为 1 -> 1 -> 2 -> 3 -> 4 -> 4 -> 5 -> 6,返回 dummy.next

结果链表:     1 -> 1 -> 2 -> 3 -> 4 -> 4 -> 5 -> 6
返回头节点:   1
import heapq
from typing import List, Optionalclass ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef mergeKLists(lists: List[Optional[ListNode]]) -> Optional[ListNode]:if not lists:return None# 使用最小堆来存储每个链表的头部节点min_heap = []for node in lists:if node:heapq.heappush(min_heap, (node.val, node))dummy = ListNode()current = dummy# 每次从堆中取出最小的节点,将其连接到结果链表中,并将该节点的下一个节点加入堆中while min_heap:val, node = heapq.heappop(min_heap)current.next = ListNode(val)current = current.nextif node.next:heapq.heappush(min_heap, (node.next.val, node.next))return dummy.next

相关文章:

【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 &#x1f680…...

3d渲染100农场如何使用?渲染100邀请码1a12

3d渲染农场通常用于电影、动画或视觉效果的渲染,本文以广受好评的渲染100农场为例,来讲解它的使用方法。 1、注册账号 前往渲染100官网(http://www.xuanran100.com/?ycode1a12)注册账号, 新用户注册记得填邀请码1a12,有30元大礼…...

【数据结构和算法】--- 基于c语言排序算法的实现(2)

目录 一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare法1.2.2 挖坑法1.2.3 前后指针法 1.3 快速排序优化1.3.1 三数取中法选key1.3.2 递归到小的子区间使用插入排序 1.4 快排非递归版 二、归并排序2.1 归并排序2.1.1 递归版2.1.2 非递归版 一、交换排序 基本思想&#xff1a…...

ORACLE的 软 软 软 解析!

在海鲨数据库架构师精英群里,有位朋友说ORACLE 有 软软软解析. 就是把执行计划缓存在客户端里,从而避免去服务端找执行计划. 他给了个设置方法, Weblogic console->datasource->connectionPool Statement Cache Type >LRU Statement Cache Size100 CURSOR_NUMBER …...

【模板】k 短路 / [SDOI2010] 魔法猪学院

题目背景 注:对于 k k k 短路问题,A* 算法的最坏时间复杂度是 O ( n k log ⁡ n ) O(nk \log n) O(nklogn) 的。虽然 A* 算法可以通过本题原版数据,但可以构造数据,使得 A* 算法在原题的数据范围内无法通过。事实上&#xff0c…...

【Make编译控制 08】CMake动静态库

目录 一、编译动静态库 二、链接静态库 三、链接动态库 前情提示:【Make编译控制 07】CMake常用命令-CSDN博客 有些时候我们编写的源代码并不需要将他们编译生成可执行程序,而是生成一些静态库或动态库提供给第三方使用,所以我们需要用到…...

05 06 Verilog基础语法与应用讲解

05. 1. 位操作 计数器实验升级&#xff0c;设计8个LED灯以每个0.5s的速率循环闪烁&#xff08;跑马灯&#xff09; 1.1 方法1&#xff1a;使用移位操作符<<来控制led灯的循环亮灭 设计代码 Verilog中&#xff0c;判断操作的时候不加位宽限定是可以的&#xff0c;比如i…...

css2复合选择器

一.后代&#xff08;包含&#xff09;选择器&#xff08;一样的标签可以用class命名以分别&#xff09; 空格表示 全部后代 应用 二.子类选择器 >表示 只要子不要孙 应用 三.并集选择器 &#xff0c;表示 代表和 一般竖着写 应用 四.伪类选择器&#xff08;包括伪链接…...

新版MQL语言程序设计:键盘快捷键交易的设计与实现

文章目录 一、什么是快捷键交易二、使用快捷键交易的好处三、键盘快捷键交易程序设计思路四、键盘快捷键交易程序具体实现1.界面设计2.键盘交易事件机制的代码实现 一、什么是快捷键交易 操盘中按快捷键交易是指在股票或期货交易中&#xff0c;通过使用快捷键来进行交易操作的…...

数据结构之基数排序

基数排序的思想是按组成关键字的各个数位的值进行排序&#xff0c;它是分配排序的一种。在该排序方法中把一个关键字 Ki看成一个 d 元组&#xff0c;即       K1i,K2i,,Kdi 其中&#xff0c;0≤ Kji<r&#xff0c;i1~ n&#xff0c;j1~d。这里的r 称为基数。若关键字是…...

区间dp 笔记

区间dp一般是先枚举区间长度&#xff0c;再枚举左端点&#xff0c;再枚举分界点&#xff0c;时间复杂度为 环形石子合并 将 n 堆石子绕圆形操场排放&#xff0c;现要将石子有序地合并成一堆。 规定每次只能选相邻的两堆合并成新的一堆&#xff0c;并将新的一堆的石子数记做该…...

MySQL-SQL优化

文章目录 1. SQL性能分析1.1 SQL执行频率1.2 慢查询日志1.3 profile详情1.4 explain 2. SQL优化2.1 Insert 优化2.2 Group By 优化2.3 Order By 优化2.4 Limit 优化2.5 Count() 优化2.6 Update 优化 3. 拓展3.1 请你说一下MySQL中的性能调优的方法&#xff1f;3.2 执行 SQL 响应…...

详细了解ref和reactive.

这几天看到好多文章标题都是类似于&#xff1a; 不用 ref 的 xx 个理由不用 reactive 的 xx 个理由历数 ref 的 xx 宗罪 我就很不解&#xff0c;到底是什么原因导致有这两批人&#xff1a; 抵触 ref 的人抵触 reactive 的人 看了这些文章&#xff0c;我可以总结出他们的想法…...

使用Linux docker方式快速安装Plik并结合内网穿透实现公网访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…...

Redis Centos7 安装到启动

文章目录 安装Redis启动redis查看redis状况连接redis服务端 安装Redis 1.下载scl源 yum install centos-release-scl-rh2.下载redis yum install rh-redis5-redis 3. 创建软连接 1.cd /usr/bin 2. In -s /opt/rh/rh-redis5/root/usr/bin/redis-server ./redis-server 3. …...

「数据结构」二叉搜索树1:实现BST

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 实现BST &#x1f349;二叉搜索树的性质&#x1f349;实现二叉搜索树&#x1f34c;插入&#x1f34c;查找&#x1f34c;删除 &am…...

可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。

姓名 王胤皓 T1 题解 T1 题面 T1 思路 样例输入就是骗人的&#xff0c;其实直接输出就可以了&#xff0c;输出 Hello 2024&#xff0c;注意&#xff0c;中间有一个空格&#xff01; T1 代码 #include<bits/stdc.h> using namespace std; #define ll long long int …...

ELFK日志采 - QuickStart

文章目录 架构选型ELKEFLK ElasticsearchES集群搭建常用命令 Filebeat功能介绍安装步骤Filebeat配置详解filebeat常用命令 Logstash功能介绍安装步骤Input插件Filter插件Grok Filter 插件Mutate Filter 插件常见的插件配置选项&#xff1a;Mutate Filter配置案例&#xff1a; O…...

微信小程序的图片色彩分析,窃取网络图片的主色调

1、安装 Mini App Color Thief 包 包括下载包&#xff0c;简单使用都有&#xff0c;之前写了&#xff0c;这里就不写了 网址&#xff1a;微信小程序的图片色彩分析&#xff0c;窃取主色调&#xff0c;调色板-CSDN博客 2、 问题和解决方案 问题&#xff1a;由于我们的窃取图片的…...

Leetcode 121 买卖股票的最佳时机

题意理解&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...