【LeetCode刷题日志】138.随机链表的复制

02-29 阅读 0评论

【LeetCode刷题日志】138.随机链表的复制

【LeetCode刷题日志】138.随机链表的复制,【LeetCode刷题日志】138.随机链表的复制,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,方法,第2张
(图片来源网络,侵删)
  • 🎈个人主页:库库的里昂
  •  🎐C/C++领域新星创作者
  •  🎉欢迎 👍点赞✍评论⭐收藏
  • ✨收录专栏:LeetCode 刷题日志
  • 🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗

    目录

    1.题目描述

    2.解题思路+代码实现

    方法:迭代 + 节点拆分

    思路及算法:

    代码实现:

    【LeetCode刷题日志】138.随机链表的复制,【LeetCode刷题日志】138.随机链表的复制,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,方法,第3张
    (图片来源网络,侵删)

    1.题目描述

    OJ链接 【leetcode 题号:138.随机链表的复制】【难度:中等】

    给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

    构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

    例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

    返回复制链表的头节点。

    用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

    【LeetCode刷题日志】138.随机链表的复制,【LeetCode刷题日志】138.随机链表的复制,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,方法,第4张
    (图片来源网络,侵删)
    • val:一个表示 Node.val 的整数。
    • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

      你的代码 只 接受原链表的头节点 head 作为传入参数。

      示例 1:

      【LeetCode刷题日志】138.随机链表的复制

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

      示例 2:

      【LeetCode刷题日志】138.随机链表的复制

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

      示例 3:

      【LeetCode刷题日志】138.随机链表的复制

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

      提示:

      • 0 val; nodeNew->next = node->next; node->next = nodeNew; } for (struct Node* node = head; node != NULL; node = node->next->next) { struct Node* nodeNew = node->next; nodeNew->random = (node->random != NULL) ? node->random->next : NULL; } struct Node* headNew = head->next; for (struct Node* node = head; node != NULL; node = node->next) { struct Node* nodeNew = node->next; node->next = node->next->next; nodeNew->next = (nodeNew->next != NULL) ? nodeNew->next->next : NULL; } return headNew; }

        复杂度分析

        • 时间复杂度:O(n),其中 nnn 是链表的长度。我们只需要遍历该链表三次。
        • 空间复杂度:O(1)。注意返回值不计入空间复杂度。

          读者们也可以自行尝试在计算拷贝节点的随机指针的同时计算其后继指针,这样只需要遍历两次。

          【LeetCode刷题日志】138.随机链表的复制


免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,人围观)

还没有评论,来说两句吧...

目录[+]