温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

LeetCode如何实现复杂链表的复制

发布时间:2021-12-15 13:59:11 来源:亿速云 阅读:150 作者:小新 栏目:大数据

这篇文章主要为大家展示了“LeetCode如何实现复杂链表的复制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“LeetCode如何实现复杂链表的复制”这篇文章吧。

题目描述

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

  • -10000 <= Node.val <= 10000
  • Node.random 为空(null)或指向链表中的节点。
  • 节点数目不超过 1000 。
     

题目样例

     

示例

     
输入
LeetCode如何实现复杂链表的复制      

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

     
输出

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

     

题目思考

  1. 如何处理 random 指针?
     

解决方案

     

思路

  • 如果只有 next 指针的话很简单, 我们只需要对每个节点新建一个相同值的节点, 并保持指向关系, 逐个遍历过去即可
  • 现在多了个 random 指针, 想要定位新的指向的节点, 一个比较自然的想法就是额外维护一个老节点到新节点的映射关系, 可以用字典来实现
  • 第一遍遍历, 就只关注 next 部分, 并建立好映射关系
  • 第二遍遍历, 考虑 random 部分, 找到对应的新链表的节点, 然后当前节点的 random 指针指向它即可
     
复杂度
  • 时间复杂度         O(N)
    • 每个节点只需要遍历两次
  • 空间复杂度         O(N)
    • 额外需要一个字典
     
代码
class Solution:
    def copyRandomList(self, head: 'Node') -> 'Node':
        if not head:
            return None
        maps = {}
        # 第一遍遍历, 建立新的链表, 以及老节点到新节点的映射关系
        copyHead = Node(head.val)
        origin, copy = head, copyHead
        maps[origin] = copy
        while origin.next:
            # 新建下一个节点, 并建立next关系
            copy.next = Node(origin.next.val)
            origin = origin.next
            copy = copy.next
            maps[origin] = copy
        # 第二遍遍历, 处理random指针部分
        origin, copy = head, copyHead
        while origin:
            if origin.random:
                # 如果老节点random指针指向非空的话, 就将当前新节点也指向随机节点对应的新节点
                copy.random = maps[origin.random]
            origin = origin.next
            copy = copy.next
        return copyHead

以上是“LeetCode如何实现复杂链表的复制”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI