오늘 문제도 링크드 리스트관련 문제입니다. 이번주까지 리트 코드의 링크드 리스트 문제를 최대한 많이 풀어보려고 합니다.
Given the head
of a sorted linked list, delete all duplicates such that each element appears only once. Return the linked list sorted as well.
Example 1:
Input: head = [1,1,2]
Output: [1,2]
Example 2:
Input: head = [1,1,2,3,3]
Output: [1,2,3]
Constraints:
[0, 300]
.100 <= Node.val <= 100
이번 문제는 오름차순으로 정렬된 연결 리스트가 주어졌을 때, 모든 중복되는 노드를 제거하고 한 번만 나오도록 변경한 연결 리스트를 반환하는 문제입니다. 물론, 오름차순은 유지해야 하구요.
연결 리스트의 노드를 순회하면서 중복되면 제거! 이렇게 진행하면 될 것 같습니다. 우선, 문제의 입출력을 살펴보겠습니다.
주어진 문제는 연결 리스트의 노드를 순회하면서 현재 노드 값과 다음 노드 값이 같다면 중복되므로, next의 위치를 next의 next로 설정한다면 해결이 가능합니다.
매우 간단히 분석이 완료되었습니다. 바로 코드를 설계해보도록 하겠습니다.
설계 내용은 문제 해결을 위한 핵심 단계를 잘 정의하고 있습니다.
head
가 None
일 수 있습니다. 이 경우 None
을 반환하면 됩니다. 이는 효율적인 예외처리입니다.curr
)를 기준으로 다음 노드가 존재하는지 확인하고, 현재 노드의 값과 다음 노드의 값이 동일한 경우에 다음 노드를 건너뛰는 방식으로 중복을 제거합니다.# Definition for singly-linked list.
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution(object):
def deleteDuplicates(self, head):
# https://leetcode.com/problems/remove-duplicates-from-sorted-list/submissions/1468959575
"""
:type head: Optional[ListNode]
:rtype: Optional[ListNode]
"""
if not head:
return None
curr = head
while curr:
while curr.next and curr.val == curr.next.val:
curr.next = curr.next.next
curr = curr.next
return head
None
인 경우, 즉 비어 있는 경우를 처리합니다. 비어 있는 리스트는 중복 제거할 필요가 없으므로 바로 None
을 반환합니다.curr
변수를 생성하여 head
를 저장합니다. 이를 통해 연결 리스트를 순회하며 중복 노드를 제거합니다.while curr
):curr
가 None
이 아닐 때까지 반복합니다. 이는 연결 리스트의 모든 노드를 방문하는 과정입니다.curr.next
와 curr.val == curr.next.val
조건을 동시에 확인합니다.curr.next
가 존재하지 않으면 더 이상 비교할 노드가 없으므로 중첩 루프를 종료합니다.curr.val
)과 다음 노드의 값(curr.next.val
)이 같으면 중복이므로 제거해야 합니다.curr.next
를 curr.next.next
로 설정하여 이루어집니다. 이렇게 하면 현재 노드의 next
가 다음 노드가 아닌 그다음 노드를 가리키게 되어 중복 노드가 리스트에서 제외됩니다.curr
)를 다음 노드로 이동시켜 순회를 계속합니다.head
)를 반환합니다.n
은 연결 리스트의 노드 개수를 나타냅니다.이번 문제는 정렬된 연결 리스트에서 중복을 제거하는 기본적인 문제로, 연결 리스트의 순회와 노드 삭제와 같은 기초적인 조작 방법을 학습하는 데 효과적입니다. 이번 문제를 통해 Linked List의 구조와 조작 방식에 대한 이해를 더욱 확장할 수 있었습니다. 다음 문제에서는 더 복잡한 연결 리스트 문제를 도전하며 학습을 이어가겠습니다. 🚀
테스트 케이스를 돌리는 전체 코드는 다음 링크에서 확인할 수 있습니다.
읽어주셔서 감사합니다!