算法题:剑指 Offer 35. 复杂链表的复制(题目+思路+代码+注释)时空 O(N) O(N) 0ms击败100%、47%用户

在这里插入图片描述

题外话,中等难度题一次AC秒杀100%用户属实有点小兴奋

题目

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

示例 1:
在这里插入图片描述

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
在这里插入图片描述

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 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 。

注意:本题与主站 138 题相同:https://leetcode-cn.com/problems/copy-list-with-random-pointer/

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

我看了下这不就是复制个链表,很简单,然后再仔细看了下有个random属性,随机指向了任意一个节点,麻烦的地方就在这,我要怎么去指向呢,一开始我想了下整两个数组,把链表变数组然后按照位置不就可以找到了,但是我想了下这如果用数组的话,我去查找那个random节点岂不是很慢,时间复杂度就成了O(N^2)了,不太行,我如果用哈希表呢,把原始链上的节点和复制出的节点作为kv这样岂不是查找的时候O(1)了,于是我建立了哈希表,遍历原始链,每个节点都创建个新的,然后把next赋值好,把random先赋值为原始链的,最后再统一利用哈希表kv操作把random也赋值好,非常巧妙了利用散列。很是舒服,一次AC秒杀100%用户。

代码

package leetcode.offer.q35;

import java.util.HashMap;

public class Solution {
    public Node copyRandomList(Node head) {
        Node root = null;
        //用个哈希表来存
        Node tmp = head,last = null;
        HashMap<Node,Node> map = new HashMap<>();
        while (tmp != null){
            Node node = new Node(tmp.val);
            //给root指向头节点
            if (root == null){
                root = node;
            }
            //给next赋值
            if (last != null){
                //上一个的next等于当前
                last.next = node;
            }else {
                //还没有上一个则为当前
                last = node;
            }
            //给random赋值,先设置为被复制链的,等下最后全部重新设置一遍就好
            node.random = tmp.random;
            //放入哈希表
            map.put(tmp,node);
            //收尾
            last = node;
            tmp = tmp.next;
        }
        //重新设置random
        for (Node node : map.values()){
            node.random = map.get(node.random);
        }
        return root;
    }

}
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
posted @ 2021-09-08 11:28  HumorChen99  阅读(1)  评论(0编辑  收藏  举报  来源