题解 | 复杂链表的复制

复杂链表的复制

https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba

/*
struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
            label(x), next(NULL), random(NULL) {
    }
};
*/
class Solution {
public:
    RandomListNode* Clone(RandomListNode* pHead) {
        if(pHead==nullptr)  return nullptr;
        RandomListNode* newHead = new RandomListNode(0);
        RandomListNode *p1=pHead, *p2=newHead;
        while(p1){
            RandomListNode* temp = new RandomListNode(p1->label);
            p2->next = temp;
            temp->next = nullptr;//每一个都当作末尾处理
            p2 = temp;
            p1 = p1->next;
        }
        p1 = pHead, p2=newHead->next;
        while(p1){
            if(p1->random){
                RandomListNode* p11 = pHead;
                RandomListNode* p22 = newHead->next;
                while(p11!=p1->random){
                    p11 = p11->next;
                    p22 = p22->next;
                }
                p2->random = p22;
            }
            p1 = p1->next;
            p2 = p2->next;
        }
        p2 = newHead->next;
        delete newHead;
        return p2;
    }
};

随机指针也是附着在存在的节点上的,所以我的思路是先建立全部节点,然后再找每个节点的随机指针依附的位置。

建立新节点的过程就是手动分配空间,然后把每个pHead链表中的节点值复制到每个对应的新节点中。

因为next指针的对应情况在两个链表中是一致的,所以我们用双指针分别指向两个链表的开头,查找和旧链表的random指针对应的next的位置(p11从头开始遍历next直到与p1->random相等),p22和p11同步操作,就可以找到新链表中p2->random指针指向的位置,然后连接起来。

这样的时间复杂度是O(n^2),因为每个有random的新节点找random都要从头遍历一次。

空间复杂度为O(n)。

全部评论

相关推荐

点赞 评论 收藏
分享
06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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