Use an adjacency list for sparse graphs because it uses O(V + E) memory and iterates neighbors efficiently. Use an adjacency matrix for dense graphs or when you need O(1) edge‑existence checks; it costs O(V^2) memory.