复杂链表的复制

复杂链表的复制

https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&&tqId=11178&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

解题思路

利用字典来将source和duplication的地址对应存储起来,形如

map<RandomListNode*,RandomListNode*> mymap;
mymap[pts] = ptd; // pts代表源地址,ptd代表副本地址。

这样就在原始的链表与副本之间建立了一一对应的关系,那么副本中的节点要想获得下一个节点的地址可以去查看字典

mymap[head2]->next = mymap[head2->next];
mymap[head2]->random = mymap[head2->random];

这样问题就基本上解决了。完整代码:

class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead)
    {
        if(!pHead) return nullptr;
        RandomListNode* head = pHead;
        map<RandomListNode*,RandomListNode*> mymap;
        while(head)
        {
            RandomListNode* cur =  new RandomListNode(head->label);
            mymap[head] = cur;
            head = head->next;
        }
        RandomListNode* head2 = pHead;
        while(head2)
        {
            mymap[head2]->next = mymap[head2->next];
            mymap[head2]->random = mymap[head2->random];
            head2 = head2->next;
        }
        return mymap[pHead];
    }
}; 

时间复杂度:O(2n),空间复杂度:O(n).

全部评论

相关推荐

10-22 12:03
山东大学 Java
程序员小白条:26届一般都得有实习,项目可以随便写的,如果不是开源社区的项目,随便包装,技术栈也是一样,所以本质应该找学历厂,多投投央国企和银行,技术要求稍微低一点的,或者国企控股那种,纯互联网一般都得要干活
应届生简历当中,HR最关...
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务