[Leetcode] 21. Merge Two Sorted Lists + 그림 풀이

2024. 11. 13. 00:05·BE/algorithm

문제: Merge Two Sorted Lists

  • 관련 토픽: LinkedList, Recursion
  • 난이도: Easy 
  • 링크  https://leetcode.com/problems/merge-two-sorted-lists

요구사항

  • list1, list2 LinkedList를 정렬된 하나의 LinkedList로 합치기 
  • list1, list2는 정렬된 LinkedList 
  • return 값의 list는 두 리스트를 기반으로 만든 값이어야 함 

조건

  • LinkedList의 노드 길이는 [0, 50]
  • -100 <= node.val <= 100 
  • list1, list2는 오름차순 정렬 (non-decreasing) 

풀이

이미 정렬된 리스트들을 하나로 합치기 위해서는 brute-forcing, LinkedList, recursion을 사용할 수 도 있음 

여기에서는 LinkedList를 사용해서 풀이 

 

1. list1과 list2를 합치기 위해서, dummy linklist node를 하나 추가! list1과 list2의 앞에 node 하나를 덧붙인다는 생각. 

2. list1, list2를 함께 iterate 하면서 값을 비교하고 dummy node에 연결해 나아간다 

 

3. 현재 list1, list2가 각각 가리키는 값을 비교하고, 오름차순 정렬에 맞는 값으로 dummy의 next 포인터를 연결해 준다 

4. 길이가 다른 list의 경우에는, 먼저 list의 끝 (=None)을 마주하는 시점에 loop를 종료한다 

4-1. Loop가 종료된 시점에서 None을 가르키지 않는 list의 나머지 부분과 dummy node를 이어준다 

코드

class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        dummy = ListNode(0)
        current = dummy 

        while list1 is not None and list2 is not None: 
            if list1.val < list2.val: 
                current.next = list1
                list1 = list1.next
            else:
                current.next = list2
                list2 = list2.next
            current = current.next

        if list1 is not None: 
            current.next = list1
        else:
            current.next = list2

        return dummy.next

시간, 공간 복잡도 

시간 복잡도 O(n+m)

  • 두 리스트를 병합하려면 각 리스트를 독립적으로 iterate 해야 함 
    • 동시에 같은 pointer가 가르키는 곳을 순회하는 것이 아닌, 조건 (list1.val < list2.val)에 부합하는 경우만 다음 val로 이동 
  • list1의 길이가 n, list2의 길이가 m이라면 n + m의 반복이 발생
  • W.C는 모든 노드를 하나씩 비교해 가면서 순회 -> n + m 의 반복

공간 복잡도 O(1)

  • dummy, current와 같은 포인터 생성
  • dummy = ListNode(0) 
  • 둘다 상수 공간 복잡도에 해당 (이유: 입력크기 O(n+m)과 상관없이 항상 하나의 노드만 사용하기 때문) 
저작자표시 비영리 변경금지 (새창열림)

'BE > algorithm' 카테고리의 다른 글

[Leetcode] 110. Balanced Binary Tree  (0) 2024.11.22
[Leetcode] 121. Best Time to Buy and Sell Stock  (7) 2024.11.14
[LeetCode] 347. Top K Frequent Elements  (0) 2023.01.04
[LeetCode] 49. Group Anagrams  (0) 2023.01.03
[LeetCode] 1. Two Sum  (0) 2023.01.03
'BE/algorithm' 카테고리의 다른 글
  • [Leetcode] 110. Balanced Binary Tree
  • [Leetcode] 121. Best Time to Buy and Sell Stock
  • [LeetCode] 347. Top K Frequent Elements
  • [LeetCode] 49. Group Anagrams
bandal-gom
bandal-gom
Devops & Backend Developer | tech blog
  • bandal-gom
    yayz's devlog
    bandal-gom
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • DevOps (22)
        • devops (4)
        • cicd (2)
        • docker (2)
        • monitoring (2)
        • nginx (4)
        • cache (1)
        • aws (1)
        • etc (6)
      • BE (21)
        • BE (3)
        • design pattern (1)
        • data structure (0)
        • spring (1)
        • algorithm (12)
      • devlog (24)
        • TIL (17)
        • programming language (2)
        • conference (2)
        • etc (3)
      • IT Review (1)
  • 블로그 메뉴

    • about.
    • 개발👩‍💻
    • etc.
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    til
    키보드케이블
    알고리즘문제풀이
    leetcode 347
    알고리즘
    algorithm
    homelab
    LeetCode
    노트북하기좋은카페
    모각코
    젠킨스
    time complexity
    hash
    개발자취업
    코딩테스트준비
    NGINX
    릿코드
    문제풀이
    99클럽
    Kotlin
    티스토리챌린지
    오블완
    항해99
    키캡
    java
    프로그래머스
    jenkins
    Python
    array
    Programmers
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
bandal-gom
[Leetcode] 21. Merge Two Sorted Lists + 그림 풀이
상단으로

티스토리툴바