본문 바로가기
CodeSignal

mergeTwoLinkedLists

by Doromi 2024. 3. 14.
728x90
반응형

두 개의 오름차순으로 정렬된 단일 연결 리스트가 주어졌을 때, 이 두 리스트를 병합하는 것입니다. 병합된 리스트도 오름차순으로 정렬되어야 합니다. 즉, 첫 번째 두 리스트의 노드를 연결하여 새로운 단일 연결 리스트를 만들어야 합니다.

이 문제를 풀기 위해서는 O(l1.length + l2.length) 시간 복잡도를 가져야 합니다. 이것이 면접에서 요구되는 작업입니다.

예를 들어, 다음과 같은 두 개의 연결 리스트가 주어졌다고 가정해 봅시다:

리스트 1: 1 -> 3 -> 5
리스트 2: 2 -> 4 -> 6
이 두 리스트를 병합하면 다음과 같은 결과가 나와야 합니다:

병합된 리스트: 1 -> 2 -> 3 -> 4 -> 5 -> 6
이 문제를 풀기 위해서는 두 리스트를 순회하면서 노드를 비교하고 새로운 연결 리스트를 만들어야 합니다. 코드로 구현할 때 주의해야 할 점은, 두 리스트 중 하나가 끝날 때까지 계속해서 노드를 추가해야 한다는 것입니다.

// Singly-linked lists are already defined with this interface:
// class ListNode<T> {
//   public T value { get; set; }
//   public ListNode<T> next { get; set; }
// }
ListNode<int> solution(ListNode<int> l1, ListNode<int> l2) {
    ListNode<int> head1 = l1;
    ListNode<int> head2 = l2;
    ListNode<int> dummyHead = new ListNode<int>();
    ListNode<int> current = dummyHead;
    
    while (head1 != null && head2 != null) {
        if (head1.value < head2.value) {
            current.next = head1; // 이미 있는 노드를 사용
            head1 = head1.next;
        } else {
            current.next = head2; // 이미 있는 노드를 사용
            head2 = head2.next;
        }
        current = current.next;
    }
    
    // 남은 노드 추가
    while (head1 != null) {
        current.next = head1;
        current = current.next;
        head1 = head1.next;
    }
    
    while (head2 != null) {
        current.next = head2;
        current = current.next;
        head2 = head2.next;
    }
    
    return dummyHead.next;
}
새로운 노드를 생성해서 해야하는 줄 알았는데, 이미 있는 노드를 연결해서 사용하면 되었습니다. 더 간단하고 공간복잡도를 줄여주었습니다.
728x90
반응형

'CodeSignal' 카테고리의 다른 글

rearrangeLastN  (0) 2024.03.20
reverseNodesInKGroups  (0) 2024.03.15
addTwoHugeNumbers  (0) 2024.03.11
isListPalindrome  (0) 2024.03.09
removeKFromList  (0) 2024.03.08