【LeetCode138】-复制带随机指针

实现思路

深拷贝的时候,连接下一节点这一操作的是简单的,难点在于,怎么确定新创建节点和原节点一一对应的关系进而去连接random
可以使用map操作,将原节点的地址映射到新创建节点的地址上。
另一种是将原节点映射到一个序号,利用vector现成序号的特性,在vector中再存储新节点的地址

实现代码

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
    
    
public:
    Node* copyRandomList(Node* head) {
    
    
        map<Node*,Node*> map;
        if(head==NULL) return NULL;
        Node *thead=new Node(head->val);
        Node *h1=head,*h2=head;
        map[head]=thead;
        
        while(head){
    
    
            Node *t=new Node(head->val);
            thead->next=t;
            map[head]=t;
            thead=t;
            head=head->next;
        }
        while(h1){
    
    
            Node *t1=map[h1];
            t1->random=map[h1->random];
            h1=h1->next;
        }
        return map[h2];
    }
};

提交结果及分析

在这里插入图片描述
map, set, multimap, and multiset
上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种。不同操作的时间复杂度近似为:

  • 插入: O(logN)
  • 查看:O(logN)
  • 删除:O(logN)

有n个元素,所以事件复杂度是O(n(logn))
空降复杂度O(n)

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/113063644