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

做网站挂谷歌广告赚钱吗模具外发加工订单网

做网站挂谷歌广告赚钱吗,模具外发加工订单网,做包装设计的网站有哪些,商业网站开发设计实训总结LeetCode 热题 100 | 138. 随机链表的复制 大家好,今天我们来解决一道经典的链表问题——随机链表的复制。这道题在 LeetCode 上被标记为中等难度,要求深拷贝一个带有随机指针的链表。 问题描述 给你一个长度为 n 的链表,每个节点包含一个额…

LeetCode 热题 100 | 138. 随机链表的复制

大家好,今天我们来解决一道经典的链表问题——随机链表的复制。这道题在 LeetCode 上被标记为中等难度,要求深拷贝一个带有随机指针的链表。


问题描述

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。

示例 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
  • -10^4 <= Node.val <= 10^4
  • Node.randomnull 或指向链表中的节点。

解题思路

核心思想
  1. 三步法

    • 第一步:在每个原节点后面插入一个新节点,新节点的值与原节点相同。
    • 第二步:设置新节点的 random 指针,利用原节点的 random 指针来设置新节点的 random 指针。
    • 第三步:将原链表和新链表分离,恢复原链表,提取新链表。
  2. 哈希表法

    • 使用一个哈希表存储原节点和新节点的映射关系。
    • 遍历原链表,创建新节点并设置 nextrandom 指针。

方法一:三步法

步骤 1:复制每个节点并插入到原节点后面
current = head
while current:new_node = Node(current.val)new_node.next = current.nextcurrent.next = new_nodecurrent = new_node.next
步骤 2:设置新节点的 random 指针
current = head
while current:if current.random:current.next.random = current.random.nextcurrent = current.next.next
步骤 3:分离原链表和新链表
current = head
new_head = head.next if head else None
while current:new_node = current.nextcurrent.next = new_node.nextif new_node.next:new_node.next = new_node.next.nextcurrent = current.next

完整代码实现

class Solution:def copyRandomList(self, head: 'Node') -> 'Node':if not head:return None# 第一步:复制每个节点并插入到原节点后面current = headwhile current:new_node = Node(current.val)new_node.next = current.nextcurrent.next = new_nodecurrent = new_node.next# 第二步:设置新节点的 random 指针current = headwhile current:if current.random:current.next.random = current.random.nextcurrent = current.next.next# 第三步:分离原链表和新链表current = headnew_head = head.nextwhile current:new_node = current.nextcurrent.next = new_node.nextif new_node.next:new_node.next = new_node.next.nextcurrent = current.nextreturn new_head

方法二:哈希表法

步骤 1:创建哈希表存储原节点和新节点的映射关系
node_map = {}
current = head
while current:node_map[current] = Node(current.val)current = current.next
步骤 2:设置新节点的 nextrandom 指针
current = head
while current:if current.next:node_map[current].next = node_map[current.next]if current.random:node_map[current].random = node_map[current.random]current = current.next

完整代码实现

class Solution:def copyRandomList(self, head: 'Node') -> 'Node':if not head:return None# 创建哈希表存储原节点和新节点的映射关系node_map = {}current = headwhile current:node_map[current] = Node(current.val)current = current.next# 设置新节点的 next 和 random 指针current = headwhile current:if current.next:node_map[current].next = node_map[current.next]if current.random:node_map[current].random = node_map[current.random]current = current.nextreturn node_map[head]

复杂度分析

  • 三步法

    • 时间复杂度:O(n),其中 n 是链表的长度。每个节点被处理三次。
    • 空间复杂度:O(1),只使用了常数级别的额外空间。
  • 哈希表法

    • 时间复杂度:O(n),其中 n 是链表的长度。每个节点被处理两次。
    • 空间复杂度:O(n),使用了哈希表存储原节点和新节点的映射关系。

示例运行

示例 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]]

总结

通过三步法或哈希表法,我们可以高效地完成带有随机指针的链表的深拷贝。三步法利用链表的结构特点,避免了额外的空间开销,而哈希表法则更直观,但需要额外的空间。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

http://www.dtcms.com/a/556535.html

相关文章:

  • 简历制作网站哪个好wordpress列表分页代码
  • 网站建设与网页设计可行性分析报告福建厦门工程建设中心网站
  • 许昌网站建设科技公司中企动力z云邮箱
  • 为企业做网站的公司天眼查官网查个人
  • 网站建设赠送seo建设网站是主营成本吗
  • 软件资源网站推荐深圳宝安区区号
  • 期末作业制作网站手机版wordpress怎么用
  • 做网站前期了解客户什么需求中国flash网站模板
  • 鹤山区网站建设东莞十大保安公司
  • 广东南电建设集团网站简约网站建设
  • 编程入门自学网站网站在工信部备案查询
  • 好用的网站管理系统wordpress点击才弹窗插件
  • 菜鸟怎样做自己的网站网站开发合同是否要交印花税
  • 梅州做网站设计公司腾讯云服务器安装wordpress
  • 婚纱网站模板给公司做网站销售怎样啦
  • 网站开发电话话术上海有名的猎头公司
  • 可以做微信公众号封面的网站企业网站优化方案
  • 中国做的手机系统下载网站建设电子商务网站策划书
  • 关于做网站的c 网站开发实例
  • 网站专题页策划国外空间做网站怎么样
  • 清流县建设局网站排版设计怎么做
  • 网站开发是用模版还是纯手打怎么建立一个网站能够与讯飞云对话
  • 网站做APP麻烦吗四川城乡建设证件查询官网
  • 北京做网站推广多少钱arcengine网站开发
  • 温岭做鞋子的网站长沙网站制作公司地址
  • 网站开发的发展历史及趋势专业提供深圳网站设计公司
  • 售后服务规范网站建设企业网站备案
  • 网站做apk制作工具wordpress 全站加密
  • 营销网站建设818gx信阳平台公司
  • 永州网站建设哪里有哈尔滨智能建站模板