题解 | 复杂链表的复制

复杂链表的复制

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)。

全部评论

相关推荐

头像
05-16 12:47
已编辑
中国地质大学(武汉) Java
你出生在农村,与其它农村小孩子无异小学时你对成绩没有概念,只感觉上课不听课也是无聊,只知道不写完作业会被老师罚站一到考试,自己成绩总是名列靠前,即使偶尔落后,你也从不在意中学时你觉得课本的东西很简单,随便学学就会了,并没有大量刷题你总是想不通,那些所谓的数学物理中难题,明明是在送分,为什么你的同学总是想不出解题方法高中时这三年你过的不容易,晚睡早起,给了自己很多压力.但是你也发现自己是有些小聪明的,你感觉班里有些同学很刻苦,但成绩比你差远了。那些数学题和物理题的陷阱,同学一遍遍踩坑,但是你总能发现并避开它们.“为了父母的期盼,为了恩师的厚望,为了天赐的智慧,为了青春的理想......”“天行健...
创作助手_刘北:其实,这种已经是神童级别的了,不费吹灰之力就能拿到自己想要的东西,就像机器按照程序走了一遍,就像我小时候看爱情公寓,觉得他们都很惨,几个人只能挤在一个房间里合租,但是好在他们有一群非常好的朋友,随着时间的推移,慢慢长大了,在看爱情公寓的时候,觉得他们都很厉害,博士、留学生、***、电台公子,数学天才,任何一个都是我可望而不可即的,更别说可以在异地认识一群更好的朋友了,所以呢,人还是要自给自足,满足当下,不要攀比,意气风发的且有理想的18岁少年永远都存在,只不过随着时间的推移他被你包裹在了洋葱的最深处。
点赞 评论 收藏
分享
05-12 11:09
已编辑
门头沟学院 后端
SmileDog12138:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
点赞 评论 收藏
分享
FieldMatching:看成了猪头顾问,不好意思
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务