[리트코드] 21. Merge Two Sorted Lists
2022. 1. 14. 01:05ㆍPython/코딩 문제
# 문제 설명
2개의 정렬된 연결리스트인 list1, list2가 주어진다. 2개의 연결리스트를 하나의 정렬된 연결리스트로 합쳐라.
# 입출력 예시
입력 | 출력 |
1 -> 2 -> 4 1 -> 3 -> 4 |
1 -> 1 -> 2 -> 3 -> 4 -> 4 |
# 코드 풀이
# 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]:
# l2 연결 : l1 끝났거나 || l2 있는데 l1이 더 크면
if (not list1) or (list2 and list1.val > list2.val):
list1, list2 = list2, list1
if list1: # l1 있으면 (우선)
list1.next = self.mergeTwoLists(list1.next, list2) # 정방향
return list1
정렬된 2개의 연결리스트를 입력받아 정렬된 1개의 연결리스트를 반환하는 문제다.
따라서 입력으로 주어진 연결리스트를 이용하여 풀 수 있다. 주어진 2개의 연결리스트 중 하나를 메인으로 하고, 나머지를 전환하여 풀 수 있다.
위 코드 상에서는 list1을 메인으로 하였다.
항상 노드가 가장 작은 값을 선택해야 한다. 따라서 list2가 list1 더 크다면 둘을 바꾸어 준다.
어려웠던 부분.
가장 작은 노드부터 시작해서, 더 큰 노드를 하나씩 뒤에 연결하는 알고리즘으로 풀었었다.
하지만 이런 방식으로 풀면 결국 가장 마지막 노드만 남게 된다. 따라서 처음 노드를 반환해야 하는 문제를 마주한다.
이는 함수의 재귀호출을 통해 해결할 수 있다.
결과적으로 함수가 반환해야 하는 것은 가장 처음의 메인노드이고, 그 다음의 노드는 메인이 되는 list1의 다음노드를 인수로 재귀호출하여 list1.next에 붙여주면 된다.
# 핵심 포인트
- 입력으로 주어진 데이터가 정렬된 연결리스트이고, 마찬가지로 정렬된 연결리스트를 반환하므로 입력 데이터를 활용해야 한다.
- 순서대로 노드를 연결하여 노드를 연결하면, 연결리스트의 특성 상 마지막 노드만이 남는다. 이를 해결하기 위해 함수의 재귀호출을 활용하여 해결할 수 있다.
반응형
'Python > 코딩 문제' 카테고리의 다른 글
[리트코드] 24. Swap Nodes in Pairs (0) | 2022.01.18 |
---|---|
[리트코드] 2. Add Two Numbers (0) | 2022.01.16 |
[리트코드] 234. Palindrome Linked List (0) | 2022.01.12 |
[백준] 1012: 유기농 배추 (0) | 2022.01.04 |
[SWEA] 5248: 그룹 나누기 (0) | 2021.12.30 |