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

难度中等358收藏分享切换为英文接收动态反馈
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

示例 1:
剑指 Offer 35. 复杂链表的复制 - 图1
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
剑指 Offer 35. 复杂链表的复制 - 图2
输入:head = [[1,1],[2,1]] 输出:[[1,1],[2,1]]
示例 3:
剑指 Offer 35. 复杂链表的复制 - 图3
输入:head = [[3,null],[3,0],[3,null]] 输出:[[3,null],[3,0],[3,null]]
示例 4:
输入:head = [] 输出:[] 解释:给定的链表为空(空指针),因此返回 null。

提示:

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

    方法一 :回溯 + 哈希表

    image.png ```javascript /**
    • // Definition for a Node.
    • function Node(val, next, random) {
    • this.val = val;
    • this.next = next;
    • this.random = random;
    • }; */

/**

  • @param {Node} head
  • @return {Node} */ var copyRandomList = function(head,nodeMap = new Map()) { if(head==null) return null; if(!nodeMap.has(head)){
    1. nodeMap.set(head,{val:head.val})
    2. Object.assign(nodeMap.get(head),{next:copyRandomList(head.next,nodeMap),random:copyRandomList(head.random,nodeMap)})
    } return nodeMap.get(head) };
    <a name="mkfam"></a>
    #### 方法二:迭代 + 节点拆分
    ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22619161/1639018197326-c99c01b3-2831-41cc-86d9-06f38d23471d.png#clientId=u415e4285-f7f9-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=567&id=ue35d263e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=567&originWidth=819&originalType=binary&ratio=1&rotation=0&showTitle=false&size=55185&status=done&style=shadow&taskId=u8666b112-67a1-4722-b6aa-6fb50ad0b3b&title=&width=819)
    ```javascript
    var copyRandomList = function(head) {
     if (head === null) {
         return null;
     }
     for (let node = head; node !== null; node = node.next.next) {
         const nodeNew = new Node(node.val, node.next, null);
         node.next = nodeNew;
     }
     for (let node = head; node !== null; node = node.next.next) {
         const nodeNew = node.next;
         nodeNew.random = (node.random !== null) ? node.random.next : null;
     }
     const headNew = head.next;
     for (let node = head; node !== null; node = node.next) {
         const nodeNew = node.next;
         node.next = node.next.next;
         nodeNew.next = (nodeNew.next !== null) ? nodeNew.next.next : null;
     }
     return headNew;
    };