133. Clone Graph
Given a reference of a node in a connected undirected graph
Hash TableExample 1:
- Input:
adjList = [[2,4],[1,3],[2,4],[1,3]] - Output:
[[2,4],[1,3],[2,4],[1,3]] - Explanation: There are
4nodes in the graph. 1stnode(val = 1)’s neighbors are 2ndnode(val =2) and 4thnode(val =4). 2ndnode(val = 2)’s neighbors are 1stnode(val =1) and 3rdnode(val =3). 3rdnode(val = 3)’s neighbors are 2ndnode(val =2) and 4thnode(val =4). 4thnode(val = 4)’s neighbors are 1stnode(val =1) and 3rdnode(val =3).
Example 2:
- Input:
adjList = [[]] - Output:
[[]] - Explanation: Note that the input contains one empty list. The graph consists of only one
nodewith val =1and it does not have any neighbors.
Example 3:
- Input:
adjList = [] - Output:
[] - Explanation: This an empty graph, it does not have any nodes.
Constraints:
- The number of nodes in the graph is in the range [0, 100].
1 <= Node.val <= 100- Node.val is unique for each node.
- There are no repeated edges and no self-loops in the graph.
- The Graph is connected and all nodes can be visited starting from the given node.
Solution
"""
# Definition for a Node.
class Node:
def __init__(self, val = 0, neighbors = None):
self.val = val
self.neighbors = neighbors if neighbors is not None else []
"""
from typing import Optional
class Solution:
def cloneGraph(self, node: Optional["Node"]) -> Optional["Node"]:
oldToNew = {}
def dfs(node):
if node in oldToNew:
return oldToNew[node]
copy = Node(node.val)
oldToNew[node] = copy
for n in node.neighbors:
copy.neighbors.append(dfs(n))
return copy
return dfs(node) if node else None