Delete Nodes From Linked List Present in Array - Leetcode 3217 - Python
- 연결 리스트에서 주어진 배열에 포함된 값을 가진 노드를 삭제하고, 수정된 리스트의 새로운 헤드를 반환하는 문제입니다. 🗑️
- 주어진 배열의 값을 해시셋(HashSet)으로 변환하여 노드 값의 존재 여부를 O(1) 시간 복잡도로 빠르게 조회함으로써 성능을 최적화합니다. 🚀
- 연결 리스트의 헤드 노드가 삭제될 수 있는 엣지 케이스를 포함하여 모든 노드 삭제 로직을 일관되게 처리하기 위해 더미 노드를 활용합니다. 🛡️
previous와 current 두 포인터를 사용하여 연결 리스트를 순회하며 노드를 처리하는 전략을 사용합니다. 🤝
current 노드의 값이 해시셋에 존재하면, previous.next를 current.next로 연결하여 current 노드를 리스트에서 제거합니다. 이때 previous는 그대로 유지하고 current만 다음 노드로 이동합니다. ❌
current 노드의 값이 해시셋에 없으면, 해당 노드를 유지하고 previous와 current 두 포인터 모두 다음 노드로 이동합니다. ✅
- 이 알고리즘의 시간 복잡도는 해시셋 생성(O(M))과 연결 리스트 순회(O(N))를 합쳐 O(N + M)이며, 공간 복잡도는 해시셋 저장을 위해 O(M)이 소요됩니다. 📈
previous 포인터 하나만 사용하여 previous.next 노드의 삭제 여부를 판단하고, 필요에 따라 previous.next를 조정하거나 previous 자체를 이동시키는 방식으로 코드를 더욱 간결하게 구현할 수 있습니다. 💡
- 모든 노드 처리 후,
dummy.next를 반환하여 수정된 연결 리스트의 새로운 헤드를 제공합니다. 만약 모든 노드가 삭제되었다면 dummy.next는 null이 됩니다. ➡️