1. 哈希map
public Node copyRandomList(Node head) {
Map<Node, Node> nodeMap = new HashMap<Node, Node>();
Node cur = head;
while(cur != null){
nodeMap.put(cur, new Node(cur.val));
cur = cur.next;
}
cur = head;
Node newhead = nodeMap.get(cur);
Node newCur = newhead;
while(cur != null){
newCur.next = nodeMap.get(cur.next);
newCur.random = nodeMap.get(cur.random);
cur = cur.next;
newCur = newCur.next;
}
return newhead;
}
时间O(n),空间O(n)
(2)递归+哈希
HashMap<Node, Node> nodemap = new HashMap<>();
public Node copyRandomList(Node head) {
if (head == null) return head;
Node cur = head;
while(!nodemap.containsKey(cur)){
Node newHead = new Node(cur.val);
nodemap.put(cur, newHead);
newHead.next = copyRandomList(cur.next);
newHead.random = copyRandomList(cur.random);
}
return nodemap.get(head);
}
时间O(n),空间O(n)
(3)迭代+节点划分
public Node copyRandomList(Node head) {
if(head == null ) return head;
Node cur = head;
while (cur != null){
Node newNode = new Node(cur.val);
newNode.next = cur.next;
cur.next = newNode;
cur = cur.next.next;
}
Node newhead = head.next;
cur = head;
while(cur != null){
Node next01 = cur.next;
// 注意null的情况
next01.random = cur.random == null? null : cur.random.next;
cur = cur.next.next;
}
cur = head;
while(cur != null){
Node next = cur.next;
cur.next = next.next;
cur = cur.next;
// null
next.next = cur == null? null : cur.next;
}
return newhead;
}
合并没成功。
时间O(n),空间O(1)