leetcode 138 复制随机链表

这个题的难点就在于,复制时,需要找到对应的新的链表,比如10指向1,我们要和新链表的1对应上,就必须要用哈希表做记录,或者用一些手法。

解法一:哈希表

考虑建一个只有next的列表,其实比较简单,但是random要求我们随机访问,所以要存一下老节点对应的新节点。

cpp 复制代码
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    Node* copyRandomList(Node* head) {
        Node *dummy = new Node(0), *p = head, *p2 = dummy;
        map<Node*, Node*> s;
        while(p)
        {
            Node *n = new Node(p->val);
            p2->next = n;
            s[p] = n;
            p2 = p2->next;
            p = p->next;
        }

        p = head, p2 = dummy->next;

        while(p)
        {
            if(p->random)
            {
                auto n2 = s[p->random];
                p2->random = n2;
            }
            p = p->next;
            p2 = p2->next;
        }

        return dummy->next;
    }
};

解法二:零空间

既然做链表题,就得要求零空间复杂度,这才是难点,但是这个算法也是真麻烦

首先,先做原数组修改,每个节点后面加上一个复制,这样就可以用核心语句 p->next->random = p->random->next; 来对所有新节点的random节点进行赋值(最难得一步)

然后就是链表分离(最恶心的一步)由于新老链表完全耦合,需要同时进行新老链表的分离操作,新链表用dummy取出,老链表用作遍历,细节比较多

cpp 复制代码
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(!head)return nullptr;

        Node *p = head, *tmp;
        while(p)
        {
            tmp = p->next;
            p->next = new Node(p->val);
            p->next->next = tmp;
            p = tmp;
        }

        p = head;
        while(p)
        {
            if(p->random)
            {
                p->next->random = p->random->next;
            }
            p = p->next->next;
        }

        Node *dummy = new Node(0);
        p = dummy;
        Node *p1 = head;
        while(p1)
        {
            p->next = p1->next;
            p = p->next;
            p1->next = p1->next->next;
            p1 = p1->next;
        }

        return dummy->next;
    }
};
相关推荐
运行时记录19 小时前
别再手动写提示词了 — SkillOpt 让技能文档自己进化
算法
啦啦啦啦啦zzzz19 小时前
算法总结(二分查找、双指针)
c++·算法
qq_85730581920 小时前
python语法
开发语言·python·算法
DXM052120 小时前
第9期|从机器学习到深度学习:AI遥感解译的进化逻辑
人工智能·算法·计算机视觉
小蒋学算法20 小时前
算法-阶乘函数后K个零
算法
weixin_3077791320 小时前
智能模拟数据生成平台:生成式AI合成数据技术重塑开发测试效能
人工智能·测试工具·算法·测试用例
羊羊小栈21 小时前
Uplift营销供应链协同决策系统(基于Uplift因果推断与运筹优化算法)
前端·人工智能·算法·毕业设计·大作业
金融小师妹21 小时前
AI因子共振模型显示:金银比突破区间上沿,白银定价逻辑进入再校准阶段
人工智能·算法·均值算法·线性回归
不会就选b21 小时前
数据结构之链表OJ题(中)
数据结构·链表
J2虾虾1 天前
C语言 typedef 用法
c语言·数据结构·算法