题目
先复制next指针,再通过寻找random在原链表的位置,复制random指针:
class Solution {
public Node copyRandomList(Node head) {
if(head==null) return null;
Node copyhead=new Node(head.val);
Node p1=head;
Node p2=copyhead;
while(p1.next!=null){
p2.next=new Node(p1.next.val);
p2=p2.next;
p1=p1.next;
}
p1=head;
p2=copyhead;
while(p1!=null&&p2!=null){
if(p1.random==null)
p2.random=null;
else{
Node p3=head;
int index=0;
while(p3!=null){
if(p3==p1.random)
break;
p3=p3.next;
index++;
}
Node p4=copyhead;
while(index>0){
p4=p4.next;
index--;
}
p2.random=p4;
}
p1=p1.next;
p2=p2.next;
}
return copyhead;
}
}
时间复杂度:O(N^2),空间复杂度:O(N)
使用集合hashmap:
class Solution {
public Node copyRandomList(Node head) {
if(head==null) return null;
Node node=head;
Map<Node,Node> myMap=new HashMap<>();
//构造每一个点
while(node!=null){
myMap.put(node,new Node(node.val));
node=node.next;
}
node=head;
while (node!=null){
myMap.get(node).next=myMap.get(node.next);
myMap.get(node).random=myMap.get(node.random);
node=node.next;
}
return myMap.get(head);
}
}
时间复杂度:O(N),空间复杂度:O(N)