본문 바로가기
HackerRank

Merge two sorted linked lists

by Doromi 2023. 10. 9.
728x90
반응형
주어진 두 개의 정렬된 연결 리스트(Linked List)를 병합하여 하나의 정렬된 연결 리스트로 합치는 알고리즘 문제입니다. 이 문제의 목표는 두 연결 리스트를 정렬된 순서로 병합하여 새로운 연결 리스트를 반환하는 것입니다.

연결 리스트는 데이터 요소(Node)로 이루어진 데이터 구조로, 각 노드는 데이터와 다음 노드를 가리키는 링크(또는 포인터)로 구성됩니다. 연결 리스트의 끝을 나타내는 노드는 다음 노드를 가리키는 링크가 없는 특별한 노드일 수 있습니다.

문제 설명:
문제의 입력으로는 두 개의 정렬된 연결 리스트 head1과 head2가 주어집니다. 이 두 연결 리스트를 정렬된 순서로 병합하여 하나의 정렬된 연결 리스트를 생성해야 합니다.

알고리즘 절차:

두 연결 리스트를 동시에 순회하면서 각 노드의 데이터를 비교합니다.
두 노드의 데이터 중 작은 값을 선택하여 새로운 노드를 생성합니다.
새로운 노드를 결과 연결 리스트에 추가합니다.
작은 값을 선택한 연결 리스트의 노드를 다음 노드로 이동합니다.
위의 과정을 반복하여 두 연결 리스트의 모든 노드를 비교하고 병합합니다.
하나의 연결 리스트가 끝에 도달하면 나머지 연결 리스트의 모든 노드를 결과 리스트에 추가합니다.
결과 연결 리스트를 반환합니다.

SinglyLinkedListNode* mergeLists(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    SinglyLinkedListNode* ret = nullptr;   // 결과 연결 리스트의 시작을 가리킬 포인터
    SinglyLinkedListNode* current1 = head1; // 첫 번째 연결 리스트를 순회하는 포인터
    SinglyLinkedListNode* current2 = head2; // 두 번째 연결 리스트를 순회하는 포인터
    SinglyLinkedListNode* tail = nullptr;   // 현재 마지막 노드를 추적하는 포인터

    // 두 연결 리스트 중 하나라도 노드가 남아 있는 동안 반복
    while (current1 || current2) {
        SinglyLinkedListNode* newNode = nullptr; // 새로운 노드를 생성할 포인터

        // 두 연결 리스트의 현재 노드를 비교하여 더 작은 값을 선택
        if (current1 && current2) {
            if (current1->data < current2->data) {
                newNode = new SinglyLinkedListNode(current1->data);
                current1 = current1->next; // 첫 번째 연결 리스트의 다음 노드로 이동
            } else {
                newNode = new SinglyLinkedListNode(current2->data);
                current2 = current2->next; // 두 번째 연결 리스트의 다음 노드로 이동
            }
        }
        // 하나의 연결 리스트에만 노드가 남아 있는 경우
        else if (current1) {
            newNode = new SinglyLinkedListNode(current1->data);
            current1 = current1->next; // 첫 번째 연결 리스트의 다음 노드로 이동
        } else if (current2) {
            newNode = new SinglyLinkedListNode(current2->data);
            current2 = current2->next; // 두 번째 연결 리스트의 다음 노드로 이동
        }

        // 결과 연결 리스트에 새로운 노드를 추가
        if (!ret) {
            ret = newNode; // 만약 결과 리스트가 비어 있다면, 새로운 노드를 시작으로 설정
            tail = newNode; // 현재 마지막 노드를 새로운 노드로 설정
        } else {
            tail->next = newNode; // 현재 마지막 노드의 다음 노드로 새로운 노드 연결
            tail = newNode;       // 현재 마지막 노드를 새로운 노드로 업데이트
        }
    }

    return ret; // 병합된 연결 리스트의 시작 포인터를 반환
}
728x90
반응형

'HackerRank' 카테고리의 다른 글

Delete duplicate-value nodes from a sorted linked list  (1) 2023.10.10
Linked Lists:Get Node Value  (0) 2023.10.10
Compare two linked lists  (0) 2023.10.09
Reverse a linked list  (0) 2023.10.08
Print in Reverse(Linked List)  (0) 2023.10.08