Day16: [LeetCode中等] 138. 复制带随机指针的链表

Day16: [LeetCode中等] 138. 复制带随机指针的链表

题源:

来自leetcode题库:

https://leetcode-cn.com/problems/copy-list-with-random-pointer/

思路:

这道题还挺有意思的,这道题之前的链表tag下的题还都挺常规的,但是这题让人眼前一亮!我的思路是这样的,遍历一遍原链表,先把正常的链表拷贝一下,也就是random都为NULL,然后遍历的同时,完成从原链表到拷贝链表的映射,也就是代码中的m2。
接着再遍历一次链表,完成原链表中每个节点对应起random节点的映射,也就是m2,。
最后遍历一次,完成拷贝链表的random指针对应的节点,这里需要两次映射,也就是代码中的m2[m1[p]]。
虽然我的方法要遍历三次,但是因为是加性的,所以时间复杂度依然O(n),不过运行时间不太好看,哈哈
值得一提的是原题的题解区真是各种值得学习的方法啊,果然越有创意的题方法就会多种多样。

代码:

dirty code凑合看吧

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;

    Node() {}

    Node(int _val, Node* _next, Node* _random) {
        val = _val;
        next = _next;
        random = _random;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(!head) return NULL;
        Node* res=new Node(head->val,NULL,NULL);
        Node* p=head;
        Node* rear=res;
        unordered_map<Node*,Node*> m1;
        unordered_map<Node*,Node*> m2;
        m2[p]=rear;
        p=p->next;
        while(p){
            rear->next=new Node(p->val,NULL,NULL);
            rear=rear->next;
            m2[p]=rear;
            p=p->next;
        }
        p=head;
        while(p){
            m1[p]=p->random;
            p=p->next;
        }
        Node* q=res;
        p=head;
        while(q){
            q->random=m2[m1[p]];
            q=q->next;
            p=p->next;
        }

        return res;
    }
};
发布了49 篇原创文章 · 获赞 13 · 访问量 549

猜你喜欢

转载自blog.csdn.net/qq2215459786/article/details/103113684