LeetCode 138. Copy List with Random Pointer

本题抽象一下就是如何deep copy图的问题。由于random指针的存在,导致我们按顺序copy的时候,copy的random指针指向的node可能还没有生成。如何解决这个问题是本题的关键。

Recursive

如果递归来做,上述问题很好解决,没有生成的节点递归生成即可。

但是我们需要用一个hashtable来记录原节点与对应copy节点的映射关系,这是因为当前需要copy的节点很可能在之前已经被创建好了。这时我们只要返回已经创建好的节点的指针即可。

class Solution {
public:
    unordered_map<Node *,Node *> m; // original node -> corresponding copied node
    
    Node* copyRandomList(Node* head) {
        if (head==NULL) return NULL;
        if (m.count(head)) return m[head];
        Node *copy=new Node(head->val,NULL,NULL);
        m[head] = copy;
        copy->next = copyRandomList(head->next);
        copy->random = copyRandomList(head->random);
        return copy;
    }
};

时间复杂度 O(n) 空间复杂度 O(n)

 

Iterative (Hashtable)

递归来写就得注意random指针了。我们可以分两步来做,首先copy链表,忽视random指针,同时建立原节点和对应copy节点的映射关系。第二步根据之前的hashtable,更新正确的random指针。

*/
class Solution {
public:
    unordered_map<Node *,Node *> m; // original node -> corresponding copied node
    
    Node* copyRandomList(Node* head) {
        if (head==NULL) return NULL;
        
        // copy all the nodes (without random) and build the mapping
        Node *dummy=new Node(0,NULL,NULL), *p=dummy, *q=head;
        while (q){
            Node *copy = new Node(q->val,NULL,q->random);
            m[q] = copy;
            p->next = copy;
            p = p->next;
            q = q->next;
        }
        
        // link random
        p = dummy->next; 
        while (p){
            if (p->random!=NULL) 
                p->random = m[p->random];
            p = p->next;
        }
        
        return dummy->next;
    }
};

时间复杂度 O(n) 空间复杂度 O(n)

 

Iterative with O(1) Space

 To be continued ...

转载于:https://www.cnblogs.com/hankunyan/p/11583728.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值