LC 21. Merge Two Sorted Lists

제론·2024년 2월 22일
0

[Algorithm] LeetCode💡

목록 보기
14/14
post-thumbnail

문제 개요

  • 두 연결리스트가 있을 때 하나의 연결리스트로 병합하는 문제이다.

  • 병합은 오름차순으로 이루어져야 한다.

풀이 구상

  • 반복문을 돌며 list1의 node 값과 list2 노드의 값을 비교해서 새로운 연결리스트에 오름차순 순으로 추가하면 될 것 같다.

  • 연결리스트는 리스트 처럼 push, pop이 아닌 node의 next 값을 갱신하면서 구성한다.

문제해결 코드

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        # 병합할 연결리스트의 맨 앞 노드의 이전 노드: head
        # head로 초기화 해주고 current에 할당해서 current.next를 계속 붙여서 이어나갈 예정
        # 연결리스트 풀이시 일반적으로 사용하는 코딩기법

        head = ListNode(None)
        # 새롭게 만들어질 연결리스트 맨 앞 노드의 이전이라고 생각하면 됨
        current = head

        # list1, list2 자체가 포인터가 되어 둘 다 None이 아닐 때까지 반복
        # 즉 list1, list2 마지막까지 반복문 돌리겠다는 의미
        while list1 and list2:
            if list1.val < list2.val:
                current.next = list1
                list1 = list1.next
            else:
                current.next = list2
                list2 = list2.next
            current = current.next
        # 둘 중 하나가 다음 값이 없을 때 처리: 새로운 연결리스트의 나머지 부분 그냥 연결
        current.next = list1 or list2
        print(head)
        return head.next
        ⬆️


# list1
# 1 -> 2 -> 5 -> N
# ⬆️
# list2
# 3 -> 4 -> 5 -> N
# ⬆️
# 병합 리스트: 1 -> 2 -> 3 -> 4 -> 5 -> 5 -> N
  • 시간복잡도는 list1, list2 모두 순회함: O(M + N)
  • 공간복자도는 current, head만 필요함: O(1)
profile
Software Developer

0개의 댓글