「LeetCode」剑指Offer-35复杂链表的复制⚡️

简介: 「LeetCode」剑指Offer-35复杂链表的复制⚡️

image.png

前言🌧️



算法,对前端人来说陌生又熟悉,很多时候我们都不会像后端工程师一样重视这项能力。但事实上,算法对每一个程序员来说,都有着不可撼动的地位。

因为开发的过程就是把实际问题转换成计算机可识别的指令,也就是《数据结构》里说的,「设计出数据结构,在施加以算法就行了」。


当然,学习也是有侧重点的,作为前端我们不需要像后端开发一样对算法全盘掌握,有些比较偏、不实用的类型和解法,只要稍做了解即可。


题目🦀



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


难度中等

请实现 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


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

注意:本题与主站 138 题相同:leetcode-cn.com/problems/co…


解题思路🌵



  • 此题可以利用Map映射来巧妙的保存新旧节点的对应关系
  • 先遍历节点,创建每个节点对应的新节点
  • 第二次遍历,利用map可以保存索引,方便地维护当前新节点的next,和random所对应的新节点
  • ⚠️ 在第一次遍历的时候,添加了一个null索引的映射为了处理特殊情况


解法🔥



/**
 * // Definition for a Node.
 * function Node(val, next, random) {
 *    this.val = val;
 *    this.next = next;
 *    this.random = random;
 * };
 */
/**
 * @param {Node} head
 * @return {Node}
 */
const copyRandomList = head => {
 const map=new Map()
 let p=head
 //先复制值
 while(p){
     map.set(p,new Node(p.val))
     p=p.next
 }
 //关键的一句,添加为null的map映射
 map.set(null,null)
 //再复制引用属性
 p=head;
 while(p){
     map.get(p).next=map.get(p.next)
     map.get(p).random=map.get(p.random)
     p=p.next
 }
 return map.get(head)
};

时间复杂度:O(n)


空间复杂度:O(n)


结束语🌞


image.png


那么鱼鱼的LeetCode算法篇的「LeetCode」剑指Offer-35复杂链表的复制⚡️就结束了,算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾,欢迎加我好友,一起沙雕,一起进步

相关文章
|
5天前
《剑指offer》——合并两个排序的链表
《剑指offer》——合并两个排序的链表
|
5天前
LeetCode链表hard 有思路?但写不出来?
LeetCode链表hard 有思路?但写不出来?
|
5天前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
9 1
|
5天前
|
存储 Java C语言
剑指offer(牛客)——从尾到头打印链表
剑指offer(牛客)——从尾到头打印链表
10 1
|
5天前
|
索引
每日一题:力扣328. 奇偶链表
每日一题:力扣328. 奇偶链表
14 4
|
5天前
leetcode代码记录(移除链表元素
leetcode代码记录(移除链表元素
11 0
【每日一题】LeetCode——反转链表
【每日一题】LeetCode——反转链表
【每日一题】LeetCode——链表的中间结点
【每日一题】LeetCode——链表的中间结点
|
5天前
|
C++
[leetcode 链表] 反转链表 vs 链表相交
[leetcode 链表] 反转链表 vs 链表相交
|
5天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”

热门文章

最新文章