홈 LeetCode. 21. Merge Two Sorted Lists
글
취소

LeetCode. 21. Merge Two Sorted Lists

image

문제

풀이

더미 헤드를 두면 결과 리스트를 간단하게 만들 수 있습니다. tail 포인터는 마지막에 추가한 노드를 가리킵니다. 두 입력 리스트가 모두 비어 있지 않은 동안 현재 노드 중 더 작은 노드를 결과에 연결하고, 그 노드가 속한 입력 리스트만 한 칸 전진시킵니다. 이 과정에서 결과는 항상 정렬된 상태이며, 입력에서 처리한 노드가 순서대로 포함됩니다. 한 리스트가 끝나면 나머지 리스트의 접미 부분을 연결합니다. 이 부분은 이미 정렬되어 있습니다.

더미 노드를 사용하면 빈 입력도 같은 방식으로 처리할 수 있습니다. 한 입력이 null이면 다른 리스트를 변경 없이 반환하고, 둘 다 null이면 결과도 null입니다. 입력 노드를 복사하지 않으며, 모든 입력 노드를 각각 한 번씩 결과에 재사용합니다.

입력 길이가 각각 N, M일 때 각 노드를 한 번씩 방문하므로 시간 복잡도는 O(N + M)입니다. 고정된 더미 노드와 포인터를 제외한 보조 공간 복잡도는 O(1)입니다.

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode dummy = new ListNode();
        ListNode tail = dummy;

        while (list1 != null && list2 != null) {
            if (list1.val <= list2.val) {
                tail.next = list1;
                list1 = list1.next;
            } else {
                tail.next = list2;
                list2 = list2.next;
            }
            tail = tail.next;
        }

        tail.next = (list1 != null) ? list1 : list2;
        return dummy.next;
    }
}
이 글은 저자가 CC BY 4.0 라이선스로 배포합니다.