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

复杂链表的复制

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

链接:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba?f=discussion
来源:牛客网

我的思路:在随机指针关系建立上,通过循环找到两个链表的对应关系。优点:运行快,缺点:内存占用大

public class Solution {
    public RandomListNode Clone(RandomListNode pHead) {
        if(pHead == null){
            return pHead;
        }

        RandomListNode deepcopy = new RandomListNode(pHead.label);
        RandomListNode pointerD = deepcopy;
        RandomListNode pointerP = pHead;

        // 第一遍先通过顺序指针将链表建立出来
        while(pointerP.next != null){
            RandomListNode temp = new RandomListNode(pointerP.next.label);
            pointerD.next = temp;
            pointerD = pointerD.next;
            pointerP = pointerP.next;
        }

        pointerD = deepcopy;
        pointerP = pHead;

        // 第二遍建立随机指针关系
        while(pointerP != null){
            if(pointerP.random == null){
                pointerP = pointerP.next;
                pointerD = pointerD.next;
                continue;
            }
            RandomListNode pointerP1 = pHead;
            RandomListNode pointerD1 = deepcopy;
            // 这里是通过遍历将原链表和新链表对应上,
            while(pointerP1 != pointerP.random){
                pointerP1 = pointerP1.next;
                pointerD1 = pointerD1.next;
            }

            pointerD.random = pointerD1;
            pointerP = pointerP.next;
            pointerD = pointerD.next;
        }

        return deepcopy;
    }
}

别人的思路(参考自https://blog.nowcoder.net/n/27e887ce682b4ec798fce79ffa3097b4):
使用了map保存两个链表的对应关系,以此建立随机指针。优点:内存占用下,缺点运行速度慢点。

import java.util.HashMap;
public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();
        RandomListNode p = pHead;
        //第一次遍历 新建立节点
        while(p != null){
            RandomListNode newNode = new RandomListNode(p.label);
            map.put(p, newNode);
            p = p.next;
        }
        //第二次遍历 赋值映射关系
        p = pHead;
        while(p != null){
            RandomListNode node = map.get(p);
            node.next = (p.next == null)?null: map.get(p.next);
            node.random = (p.random == null)?null: map.get(p.random);
            p = p.next;
        }
        //最后的返回值
        return map.get(pHead);

    }
}
全部评论

相关推荐

2025-12-17 13:34
复旦大学 算法工程师
回家当保安:复旦✌🏻,佬你的简历感觉挺好的,寒假日常hc比较少。佬可以过完年之后再试试,日常实习hc比较充足
点赞 评论 收藏
分享
2025-11-22 16:20
已编辑
用友_Java开发实习生(实习员工)
等闲_:感觉有好多地方会被问穿,mysql存储向量这个方案问题应该很大的,如果深问的的话,为什么不用es,不用pg,不用mivus,分块策略是怎么做的,向量化是怎么向量化的,稠密向量还是稀疏向量,再深问余弦相似度,HSWM算法,Bm25算法,为什么不用混合检索或者Rank重排序优化?其他的项目不停机分库分表咋实现的,切库过程中数据有diff的话有没有补偿策略?既然有了分库分表了有没有碰到业务上不好优化的慢sql,让这个sql读从库?而且点评的话,最好自己压测过,要不这个数据也不好解释。现在就27的情况来看,很多同学已经有了中大厂实习,这个节点也会偏向这些有大厂实习的92同学,而且hc也不多,所以坚持海投吧
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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