剑指 Offer 35. 复杂链表的复制
思路#
方法一:哈希表#
1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 Node* next; 7 Node* random; 8 9 Node(int _val) { 10 val = _val; 11 next = NULL; 12 random = NULL; 13 } 14 }; 15 */ 16 class Solution { 17 public: 18 Node* copyRandomList(Node* head) { 19 unordered_map<Node *, Node *> mp; 20 Node *p = head; 21 while(p != NULL) { 22 mp[p] = new Node(p->val); 23 p = p->next; 24 } 25 26 p = head; 27 while(p != NULL) { 28 mp[p]->next = mp[p->next]; 29 mp[p]->random = mp[p->random]; 30 p = p->next; 31 } 32 33 return mp[head]; 34 35 } 36 };
复杂度分析#
时间复杂度:O(n)。
空间复杂度:O(n)。长度为n的链表,需要构造一个大小为n的<Node*, Node*>的哈希表,所以空间复杂度为O(n)。
方法二:迭代新旧节点交错的链表#
1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 Node* next; 7 Node* random; 8 9 Node(int _val) { 10 val = _val; 11 next = NULL; 12 random = NULL; 13 } 14 }; 15 */ 16 class Solution { 17 public: 18 /* 19 Old List: A --> B --> C --> D 20 InterWeaved List: A --> A' --> B --> B' --> C --> C' --> D --> D' 21 */ 22 Node* copyRandomList(Node* head) { 23 if(head == NULL) 24 return NULL; 25 //将1->2->3 拼为 1 -> 1`-> 2 -> 2`-> 3 -> 3` 26 Node *p = head; 27 while(p != NULL) { 28 Node *newNode = new Node(p->val); 29 newNode->next = p->next; 30 p->next = newNode; 31 p = newNode->next; 32 } 33 34 //连接random指针 35 p = head; 36 while(p != NULL) { 37 if(p->random) 38 p->next->random = p->random->next; 39 else 40 p->next->random = NULL; 41 p = p->next->next; 42 } 43 44 //分离两个链表 45 p = head; 46 Node *newHead = head->next; 47 Node *q; 48 while(p != NULL) { 49 q = p->next; 50 p->next = q->next; 51 p = q->next; 52 if(p) 53 q->next = p->next; 54 else 55 q->next = NULL; 56 } 57 58 return newHead; 59 } 60 };
复杂度分析#
时间复杂度:O(n)
空间复杂度:O(1)
分类:
剑指Offer(第2版)
标签:
链表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2019-11-01 Devc++读取不了当前目录下的文件的解决方法