方法一:拷贝
/*
// 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) {
if (head == null) {
return null;
}
Node cur = head;
//链表复制
while (cur != null) {
Node tmp = cur.next;
cur.next = new Node(cur.val, null, null);
cur.next.next = tmp;
cur = tmp;
}
cur = head;
while (cur != null) {
if (cur.random != null) {
cur.next.random = cur.random.next;
}
cur = cur.next.next;
}
cur = head;
Node copy_head = cur.next;
Node copy_cur = copy_head;
while (copy_cur.next != null) {
cur.next = cur.next.next;
cur = cur.next;
copy_cur.next = copy_cur.next.next;
copy_cur = copy_cur.next;
}
cur.next = null;
return copy_head;
}
}
时间复杂度:O(N)
空间复杂度:O(1)
方法二:用hash表
/*
// 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) {
if (head == null) {
return null;
}
Map<Node, Node> map = new HashMap<>();
Node node = head;
while (node != null) {
map.put(node, new Node(node.val, null, null));
node = node.next;
}
node = head;
while (node != null) {
map.get(node).next = map.get(node.next);
map.get(node).random = map.get(node.random);
node = node.next;
}
return map.get(head);
}
}
时间复杂度:O(N)
空间复杂度:O(N)