题解 | #复杂链表的复制#

复杂链表的复制

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

在不限制时间复杂度的情况下,这题难度并不高。 首先遍历一次链表来深拷贝出一个新链表,这次深拷贝不考虑random的值,仅将链表的label和next深拷贝出来。这样就得到了链表的基本骨架。再用一个二重循环遍历链表,每次处理一个结点,通过一个循环来从骨架链表中找到一个label域和原链表中ramdom域的label域相等的结点,将该结点赋给被处理结点的random域。 这样做使用了一个二重循环,时间复杂度为O(n^2),空间复杂度为O(1)。

/*
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){
            return nullptr;
        }
        RandomListNode* newHead = new RandomListNode(pHead->label);
        RandomListNode* p = pHead->next;
        RandomListNode* pre = newHead;
        while(p){
            pre->next = new RandomListNode(p->label);
            pre = pre->next;
            p = p->next;
        }
        p = pHead;
        pre = newHead;
        while(pre){
            if(p->random == nullptr){
                p = p->next;
                pre = pre->next;
                continue;
            }
            RandomListNode* temp = newHead;
            while(temp){
                if(temp->label == p->random->label){
                    pre->random = temp;
                }
                temp = temp->next;
            }
            pre = pre->next;
            p = p->next;
        }
        
        return newHead;
    }
};

若对上面这种做法的时间复杂度不满意,可以使用空间换时间的方法,在第一次遍历构建骨架时就将对应的random域信息存在一个数组中,将新建结点的信息存在另一数组中,这样在第二次遍历时只用一重循环即可找到对应的random域。这样做时间复杂度为O(n),空间复杂度为O(n)。 这里又个小坑,最开始为了追求代码简洁,在while循环中使用了形如array[i++]这种形式的写法,但是会导致结果与预想的不符。最后还是老老实实的用array[i];i++;这种形式,这样结果就正常了。偷懒需谨慎。

/*
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){
            return nullptr;
        }
        RandomListNode* newHead = new RandomListNode(pHead->label);
        RandomListNode* p = pHead->next;
        RandomListNode* pre = newHead;
        RandomListNode* arr[100];
        int index = 0;
        arr[index] = newHead;
        int randomList[100] = {-1};
        if(pHead->random){
            randomList[index++] = pHead->random->label;
        }
        else{
            randomList[index++] = -1;
        }
        while(p){
            pre->next = new RandomListNode(p->label);
            if(p->random){
                randomList[index] = p->random->label;
            }
            else{
                randomList[index] = -1;
            }
            pre = pre->next;
            arr[index++] = pre;
            p = p->next;
        }
        pre = newHead;
        index = 0;
        while(pre){
            if(randomList[index] == -1){
                index++;
                pre->random = nullptr;
                pre = pre->next;
                continue;
            }
            pre->random = arr[randomList[index]-1];
            pre = pre->next;
            index++;
        }
        return newHead;
    }
};
全部评论

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午 腾讯csig 腾讯云部门,面完秒进入复试状态4.16下午 美团优选供应链部门,4.18上午发二面4.17晚上 阿里国际一面,纯拷打,面完我都玉玉了4.18下午 阿里国际二面,是我们leader面的我,很轻松~~4.18晚上 约了hr面4.19上午 hr面,下午两点口头oc4.19晚上 意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月  一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月 莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务