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

news2024/11/18 18:42:50

 🎉🎉欢迎光临🎉🎉

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

🌟特别推荐给大家我的最新专栏《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 = val
        self.next = next
        self.random = random

def cloneRandomNode(head):
    if not head:
        return None
    
    # 第一步:复制每个节点,并将新节点插入原节点后面
    curr = head
    while curr:
        new_node = Node(curr.val)
        new_node.next = curr.next
        curr.next = new_node
        curr = new_node.next
    
    # 第二步:设置每个新节点的随机指针
    curr = head
    while curr:
        curr.next.random = curr.random.next if curr.random else None
        curr = curr.next.next
    
    # 第三步:分离新旧节点,返回复制链表的头节点
    curr = head
    new_head = head.next
    while curr:
        next_old = curr.next
        next_new = curr.next.next
        curr.next = next_new
        if next_new:
            curr.next.next = next_old
        curr = next_old
    
    return 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, Optional

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def 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.next
        if node.next:
            heapq.heappush(min_heap, (node.next.val, node.next))
    
    return dummy.next

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

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

相关文章

【正式】今年第一篇CSDN(纯技术教学)

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件(木马、病毒、恶意脚本、webshell等),并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方,由于程序对用户上传…

CSP-202009-1-称检测点查询

CSP-202009-1-称检测点查询 解题思路 本题的时间复杂度貌似没有限制&#xff0c;直接暴力枚举就能知识盲点&#xff1a;sort()函数-升序排序 #include <algorithm>给名为dis&#xff0c;长度为n的数组排序sort(new_dis, new_dis n); #include <iostream> #inc…

三、OpenAI所有模型介绍

1. 综述 OpenAI API开发了具有各种能力的模型。可以根据不同的需求选择不同的模型并进行精调。 模型描述GPT-4、GPT-4 Turbo一组从GPT-3.5升级后的模型&#xff0c;能够生成自然语言和代码GPT-3.5 Turbo一组从GPT-3.5升级后的模型&#xff0c;能够生成自然语言和代码DALL.E能…

搭建yum仓库服务器

安装 1.安装linux 1.1安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 1.2下载 cd /opt/nginx wget http://nginx.org/download/nginx-1.25.3.tar.gz 1.3解压 tar -xvf nginx-1.25.3.tar.gz 1.4配置 cd nginx-1.25.3 ./configure --pre…

python高校实验室管理系统的django设计与实现81txp

技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5.7 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm .本高校实验室管理系统采用python语言、MySQL数据库&…

python 爬虫篇(3)---->Beautiful Soup 网页解析库的使用(包含实例代码)

Beautiful Soup 网页解析库的使用 文章目录 Beautiful Soup 网页解析库的使用前言一、安装Beautiful Soup 和 lxml二、Beautiful Soup基本使用方法标签选择器1 .string --获取文本内容2 .name --获取标签本身名称3 .attrs[] --通过属性拿属性的值标准选择器find_all( name , at…

ad18学习笔记十八:如何放置丝印层敷铜?

我画板的时候&#xff0c;需要把板卡顶面丝印层的一个矩形区域&#xff0c;画成白色&#xff0c;但是这个区域内有好几个焊盘&#xff0c;丝印涂色的地方需要避开这几个焊盘&#xff0c;我觉得不能简单的在丝印层画一个矩形完事&#xff0c;最好让丝印层的这个区域&#xff0c;…

会声会影绿幕抠图操作方法 会声会影绿幕抠图有绿色残边 绿幕抠图视频有绿边怎么处理 抖音怎么剪辑视频 视频剪辑软件推荐

科幻片里真的存在怪兽吗&#xff1f;外太空的画面是直接将演员放入太空拍摄的吗?其实这些不切实际的画面是通过绿幕拍摄实现的。你只需要在绿幕前拍一段太空漫步的视频&#xff0c;再利用会声会影的抠图功能就能实现&#xff01;如果你还不会绿幕抠图&#xff0c;我今天就手把…

【从Python基础到深度学习】6. IPython使用PyCharm代码调试与使用PEP

一、IPython交互式shell Python的解释器如今有多个语言的实现&#xff0c;包括: CPython ——官方版本的c语言实现 ython ——可以运行在Java平台 IronPython ——可以运行在.NET和Mono平台PyPy —— Python实现的&#xff0c;支持JIT即时编译 1.PyCharm中 2.Ubuntu终端中 s…

NSB_Login

1.访问界面 2.查看源码&#xff0c;发现提示爆破字典 3.下载字典 https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt4.burp进行爆破。&#xff08;字典有点大&#xff0c;直接裂开。&#xff09; 5.爆破成功&#xff0c;密码 scream &am…

C++入门篇(4)—— 类与对象(1)

目录 1.类的引入 2.类的定义 3.类的访问限定符 4.类的作用域 5. 类对象的存储方式 6. this指针 6.1 this指针的引入 6.2 this指针的特性 6.3有意思的面试题 1.类的引入 C语言struct 结构体中只能定义变量&#xff0c;而C中可以定义函数。 struct Date {void Init(int…

XSS-Lab

1.关于20关的payload合集。 <script>alert(1)</script> "><script>alert(1)</script> onclickalert(1) " onclick"alert(1) "><a href"javascript:alert(1)"> "><a HrEf"javascript:alert…

古典密码(5)

一、Porta密码--替换密码 1.介绍&#xff1a;Porta密码(Porta Cipher)是一个由意大利那不勒斯的医生Giovanni Battista della Porta发明的多表代换密码&#xff0c;Porta密码加密解密过程的是相同的。Vigenere 密码是具有 26 个字母的多字母密码&#xff0c;而 Porta 除了仅使…

Linux应用程序几种参数传递方式

大家好&#xff0c;今天给大家介绍Linux应用程序几种参数传递方式&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在Linux中&#xff0c;应用程序可以通过多种方式接收参数。以下…

JavaScript综合练习4

JavaScript 综合练习 4 1. 案例演示 2. 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

从源码学习访问控制符使用

从源码学习访问控制符使用 Java中的访问控制符 ​ 在Java中&#xff0c;有四个访问控制符&#xff1a;public、protected、default&#xff08;默认或缺省&#xff0c;不使用关键字&#xff09;和private。 ​ 它们的访问范围如下&#xff1a; public&#xff1a;公共访问权…

【数据分享】1901~2022中国1km逐月潜在蒸散发数据集

大家新年好啊&#xff01;今天给大伙儿分享的是1901~2022中国1km逐月潜在蒸散发数据集&#xff0c;收藏一下&#xff0c;过完年再看&#xff01;当然了&#xff0c;如果有问题的朋友&#xff0c;可以添加俺微信交流。 1 数据简介 数据集为中国逐月潜在蒸散发&#xff0c;空间分…

Redis核心技术与实战【学习笔记】 - 24.Redis 脑裂

简述 所谓脑裂&#xff0c;就是指在主从集群中&#xff0c;同时有两个主节点&#xff0c;它们都能接收写请求。而脑裂最直接的影响就是客户端不知道该往哪个主节点写入数据&#xff0c;结果就是不同的客户端会往不同的主机诶点上写入数据。而且&#xff0c;严重的话&#xff0…

尝新果未熟,探新途未尽。寒冬凝锐气,雷鸣蓄神力——小康师兄的2023年度总结

文章目录 一、前言二、工作总结2.1 我期望的&#xff0c;而公司想要的2.2 公司利益VS员工利益2.3 这个问题问得很有问题 三、生活总结3.1 一胎3.2 二胎 四、其他总结4.1 博客4.2 无人自助台球馆4.3 我要出书了 五、OKR 一、前言 又是一年除夕夜&#xff0c;万家灯火同团圆。 老…

15.3 Redis入门(❤❤❤❤)

15.3 Redis入门❤❤❤❤ 1. redis简介与配置1.1 简介1.2 Windows安装1.3 Linux安装1.4 守护进程方式启动1.5 客户端启动与使用1.6 指定生成日志 2. 使用2.1 客户端redis使用命令2.2 redis存储的数据类型1. String字符串类型2. Hash键值类型3. List列表类型4. Set与Zset集合类型…