Open songyy5517 opened 1 year ago
思路1:分治法&哈希表存储节点对(以空间换时间)
复杂度分析:
/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
*/
class Solution {
public Node copyRandomList(Node head) {
// 1. 异常处理
if (head == null)
return null;
// 2. 定义链表指针和哈希表
Node cur = head;
HashMap<Node, Node> node_table = new HashMap();
// 3. 将链表中的节点复制一份到哈希表中
while(cur != null){
node_table.put(cur, new Node(cur.val)); //!
cur = cur.next;
}
// 3. 同时复制链表的next和random部分
cur = head;
while(cur != null){
node_table.get(cur).next = node_table.get(cur.next);
node_table.get(cur).random = node_table.get(cur.random);
cur = cur.next;
}
// 4. 返回新链表的头节点
return node_table.get(head);
}
}
思路2:拼接 & 拆分
复杂度分析:
import java.util.*;
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead) {
// 思路:拷贝节点 & 拆分链表
// 1. 异常处理
if (pHead == null)
return null;
// 2. 在原链表的每个节点后拷贝该节点(A-B -> A-A'-B-B')
RandomListNode p = pHead;
while (p != null) {
RandomListNode new_Node = new RandomListNode(p.label);
new_Node.next = p.next;
p.next = new_Node;
p = new_Node.next;
}
// 3. 完成新链表random部分的拷贝
p = pHead;
while (p != null){
if (p.random != null)
p.next.random = p.random.next;
p = p.next.next;
}
// 4. 完成新链表next部分的拷贝并拆分两个链表
RandomListNode raw = pHead;
RandomListNode new_head = pHead.next;
p = pHead.next;
while (raw != null) {
// 先拆分出原链表(断掉第一根连接)
raw.next = raw.next.next;
raw = raw.next;
// 拆分新链表(断掉第二根连接)
if (p.next != null)
p.next = p.next.next;
p = p.next;
}
return new_head;
}
}
2023/2/2
2024/1/13
请实现
copyRandomList
函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个next
指针指向下一个节点,还有一个random
指针指向链表中的任意节点或者null
。示例 1:
示例 2:
示例 3:
示例 4: