15.複製含有隨機指針的鏈表

【題目】

給定一個鏈表,每個節點包含一個額外增加的隨機指針,該指針可以指向鏈表中的任意節點或空節點。要求返回這個鏈表的深拷貝

【代碼1】

時間複製度O(n),空間複製度O(n)

class Solution {
    public Node copyRandomList(Node head) {
        Node cur = head;
        Map<Node, Node> map = new HashMap<Node, Node>();
        while(cur != null){
            map.put(cur, new Node(cur.val));
            cur = cur.next;
        }
        cur = head;
        while(cur != null){
            map.get(cur).next = map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
            cur = cur.next;
        }
        return map.get(head);
    }
}

###【代碼2】
時間複製度O(n),空間複雜度O(1)

class Solution {
    public Node copyRandomList(Node head) {
        if(head == null){
            return null;
        }
        Node random = null;
        //1.每一個真實的節點後面加入一個拷貝節點
        Node node = head;
        while(node != null){
            Node copyNode = new Node(node.val);
            Node nextNode = node.next;
            node.next = copyNode;
            copyNode.next = nextNode;
            node = nextNode;
        }

        node = head;
        //2.copy Random節點
        while(node != null){
            Node nextNode = node.next.next;
            Node nodeRandom = node.random;
            if(nodeRandom == null){
                node.next.random = null;
            }else{
                node.next.random = nodeRandom.next;
            }
            node = nextNode;
        }

        node = head;
        random = node.next;
        Node resultNode = random;
        //3.獲得copy節點
        while(node != null){
            Node nextNode = node.next.next;
            Node randomNext = random.next == null ? null: random.next.next;
            node.next = nextNode;
            random.next = randomNext;
            node = nextNode;
            random = randomNext;
        }
        return resultNode;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章