这道题咋看挺复杂,又要clone node还要clone random link,但其实只要用一个HashMap就可以轻松解决,以下是我的算法,先clone node和node的next link,然后clone node的random link,时间复杂度O(n):
public Node copyRandomList(Node head) { if (head == null) return null; Map<Node, Node> map = new HashMap<>(); Node res = new Node(head.val); clone(head, res, map); randomLink(head, res, map); return res; } private void clone(Node oldNode, Node newNode, Map<Node, Node> map) { map.put(oldNode, newNode); if (oldNode.next != null) { newNode.next = new Node(oldNode.next.val); clone(oldNode.next, newNode.next, map); } } private void randomLink(Node oldNode, Node newNode, Map<Node, Node> map) { if (oldNode.random != null) { newNode.random = map.get(oldNode.random); } if (oldNode.next != null) { randomLink(oldNode.next, newNode.next, map); } }
Another recursive version:
class Solution { public Node copyRandomList(Node head) { if(head==null) return null; Map<Node, Node> map = new HashMap<>(); Node newHead = new Node(head.val); copy(head, newHead, map); copyRamdom(head, newHead, map); return newHead; } private void copyRamdom(Node oldNode, Node newNode, Map<Node, Node> map){ if(oldNode!=null){ Node oldRandom = oldNode.random; if(map.containsKey(oldRandom)){ Node newRandom = map.get(oldRandom); newNode.random = newRandom; } copyRamdom(oldNode.next, newNode.next, map); } } private void copy(Node oldNode, Node newNode, Map<Node, Node> map){ map.put(oldNode, newNode); if(oldNode.next!=null){ Node nextNode = new Node(oldNode.next.val); newNode.next = nextNode; copy(oldNode.next, newNode.next, map); } } }
Iterative version:
class Solution { public Node copyRandomList(Node head) { if(head==null) return null; Map<Node, Node> map = new HashMap<>(); Node newHead = new Node(head.val); copy(head, newHead, map); copyRamdom(head, newHead, map); return newHead; } private void copyRamdom(Node oldNode, Node newNode, Map<Node, Node> map){ while(oldNode!=null){ Node oldRandom = oldNode.random; if(map.containsKey(oldRandom)){ Node newRandom = map.get(oldRandom); newNode.random = newRandom; } oldNode= oldNode.next; newNode = newNode.next; } } private void copy(Node oldNode, Node newNode, Map<Node, Node> map){ map.put(oldNode, newNode); while(oldNode.next!=null){ Node nextNode = new Node(oldNode.next.val); map.put(oldNode.next, nextNode); oldNode = oldNode.next; newNode.next = nextNode; newNode = newNode.next; } } }