字节跳动笔试题——复杂链表的复杂——剑指 Offer 35. 复杂链表的复制——python && C++源代码

简介: 字节跳动笔试题——复杂链表的复杂——剑指 Offer 35. 复杂链表的复制——python && C++源代码

剑指 Offer 35. 复杂链表的复制


难度中等529收藏分享切换为英文接收动态反馈


请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。


示例 1:


image.png


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

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

示例 2:


image.png


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

输出:[[1,1],[2,1]]

示例 3:


image.png


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

输出:[[3,null],[3,0],[3,null]]

示例 4:


输入:head = []

输出:[]

解释:给定的链表为空(空指针),因此返回 null。

提示:


-10000 <= Node.val <= 10000

Node.random 为空(null)或指向链表中的节点。

节点数目不超过 1000 。

解题思路:

哈希+字典序


相比较普通的链表复制,增加了一个随机的,其实也很简单,使用字典将随机的那个也放到字典即可,然后输出我们想要的


Python代码:

class Solution:
    def copyRandomList(self, head: 'Node') -> 'Node':
        if not head: return
        ym = head
        ans = {}
        while ym:
            ans[ym] = Node(ym.val)
            ym = ym.next
        ym = head
        while ym:
            ans[ym].next = ans.get(ym.next)
            ans[ym].random = ans.get(ym.random)
            ym = ym.next
        return ans[head]

C++代码:

class Solution:
    def copyRandomList(self, head: 'Node') -> 'Node':
        if not head: return
        ym = head
        ans = {}
        while ym:
            ans[ym] = Node(ym.val)
            ym = ym.next
        ym = head
        while ym:
            ans[ym].next = ans.get(ym.next)
            ans[ym].random = ans.get(ym.random)
            ym = ym.next
        return ans[head]
相关文章
|
4月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
249 0
|
4月前
|
索引 Python
【Leetcode刷题Python】328. 奇偶链表
在不使用额外空间的情况下,将链表中的奇数和偶数索引节点重新排序的方法,并提供了相应的Python实现代码。
35 0
|
2月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
42 1
WK
|
3月前
|
机器学习/深度学习 Java 程序员
为什么Python比C++慢很多?
Python相较于C++较慢主要体现在:动态类型系统导致运行时需解析类型,增加开销;作为解释型语言,逐行转换字节码的过程延长了执行时间;自动内存管理和垃圾回收机制虽简化操作但也带来了额外负担;全局解释器锁(GIL)限制了多线程性能;尽管Python库方便灵活,但在性能上往往不及C++底层库。然而,Python在某些领域如数据分析、机器学习中,凭借其高级别抽象和简洁语法仍表现出色。选语言需依据具体应用场景和需求综合考量。
WK
87 1
|
4月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
29 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
4月前
|
Unix C语言 C++
Python调用C/C++
Python调用C/C++
27 2
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
43 4
|
4月前
|
Python
【Python】Python30个笔试题
本文提供了一份包含30个问题的Python笔试试题集
153 1
|
4月前
|
存储 Python
【Leetcode刷题Python】23. 合并K个升序链表
合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。
21 1