부부의 코딩 성장 일기

LeetCode 83(Remove Duplicates from Sorted List, Python) 본문

Algorithm/LeetCode

LeetCode 83(Remove Duplicates from Sorted List, Python)

제로_콜라 2023. 11. 12. 19:00

1. 문제 링크

 

Remove Duplicates from Sorted List - LeetCode

Can you solve this real interview question? Remove Duplicates from Sorted List - 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: [https://assets.le

leetcode.com

2. 문제 설명

  • 오름차순 정렬된 연결 리스트(linked list)가 주어졌을 때 중복되는 항목을 제거한 연결 리스트를 반환하는 문제
  • 예시) head = [1,1,2]로 주어지면 [1, 2]를 반환. 단, 평소 list가 아님에 유의.
  • 연결 리스트에 대해 처음 접하고 기록해둔 글은 이것 참고 LeetCode 21(Merge Two Sorted Lists, Python) (tistory.com)

3. 처음 풀이

  • head2를 생성하고 head가 주어졌을 때 값이 다르면 head2에 이어붙여주고, 값이 같으면(중복) 이어붙이지 않는다.
  • 이후 head2, head 모두 한 칸씩 이동을 반복
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        result = ListNode(-101) #주어지는 연결리스트의 val은 -100이상 100이하로 이와 겹치지 않게 설정
        head2 = result

        while head:
            if head.val == head2.val: #값이 중복되면 head를 옮겨 저장하지 않고 그냥 다음 칸으로 이동
                head = head.next
            else:
                head2.next = ListNode(head.val) #값이 다르면 head2의 다음 칸에 head를 옮겨 저장
                head = head.next #head 다음 칸으로 이동
                head2 = head2.next #head2도 다음 칸으로 이동
                
        
        return result.next

4. 다른 풀이

  • head2에 옮겨줄 때 ListNode(head.val)로 옮기는 것은 val 정보로만 새로 노드를 만드는 어색한 작업
  • head의 노드를 그대로 옮겨주는 것이 자연스럽다. 
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        cur = head
        while cur and cur.next:
            if cur.val == cur.next.val: #현재 값과 다음 값이 같으면 다음 노드를 생략(그 다음 노드로 치환)
                cur.next = cur.next.next
            else: #그렇지 않으면 즉, 값이 중복되지 않으면 다음 노드를 가져오기
                cur = cur.next
        return head

5. 배운 점

  • 연결 리스트가 아직은 어색함. 
  • 다른 사람들 풀이를 많이 접해봐야겠음.

'Algorithm > LeetCode' 카테고리의 다른 글

LeetCode 100(Same Tree, Python)  (0) 2023.11.15
LeetCode 94(Binary Tree Inorder Traversal, Python)  (1) 2023.11.14
LeetCode 70(Climbing Stairs, Python)  (1) 2023.11.11
LeetCode 69(Sqrt(x), Python)  (0) 2023.11.10
LeetCode 67(Add Binary, Python)  (0) 2023.11.09