[路飞]_算法成长之路三十八,复杂链表的复制

64 阅读1分钟

个人算法成长之路三十八!!!定期更新一些刷题过程中个人的思路以及理解。有兴趣的朋友们可以互动交流哈~

题目:

剑指 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:

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

解题思路:

拼接+拆分链表

// 拼接+拆分链表,空间复杂度O(1)
var copyRandomList = function(head){
    if(!head) return head;
    let node = head;

    // 复制节点,将新节点放到原节点后面
    while(node){
        node.next = new Node(node.val, node.next);
        node = node.next.next;
    }

    node = head;
    // 构建新节点的random指向
    while(node){
        if(node.random !== null) node.next.random = node.random.next;
        node = node.next.next;
    }

    // 拆分链表
    let newNode = head.next, res = newNode;
    node = head;
    while(node.next && newNode.next){
        node.next = node.next.next;
        newNode.next = newNode.next.next;
        node = node.next;
        newNode = newNode.next;
    }
    node.next= null;

    // 返回新链表的头结点
    return res;
}