Profile image with cat

Jaehee

Hi!

Thumbnail of LeetCode - 21. Merge Two Sorted Lists

LeetCode - 21. Merge Two Sorted Lists LeetCode

작성일 : 2021년 12월 06일  / 수정일 : 2024년 06월 06일

목차

  1. 문제 개요
  2. 풀이
    1. Solution
      1. 제출 결과

문제 개요

난이도 - EASY 사용 언어 - C++

오름차순으로 정렬된 두 연결 리스트가 입력으로 들어옵니다.

단순히 두 연결 리스트를 오름차순으로 하나의 연결 리스트로 합쳐 반환하면 됩니다.

example

문제 - LeetCode - 21. Merge Two Sorted Lists

풀이

My Solutions(Github)

Solution

EASY 난이도인 만큼 크게 어려운 문제는 아닙니다.

두 연결 리스트를 순회하면서 크기가 작은 노드를 골라(오름차순으로 연결해야 하니) 새로운 연결 리스트에 연결해주면 됩니다.

ListNode* mergedHead = nullptr;
ListNode* lastNode = nullptr;
 
ListNode* node1 = list1;
ListNode* node2 = list2;

먼저 새로운 연결 리스트의 head 포인터인 mergedHead포인터를 선언하고, 일종의 tail 포인터 역할을 맡는 lastNode포인터를 선언합니다.

새로운 연결 리스트를 구성할때는 항상 마지막에 노드를 삽입해야하기 때문에 별도의 tail 포인터를 사용합니다.

그리고 입력된 두 연결 리스트의 순회를 위해 node1, node2 포인터를 선언하여 초기화합니다.

while (node1 && node2)
{ ... }

이제 두 리스트를 동시에 순회합니다. 두 리스트의 노드의 크기를 비교해야 하기 때문에 동시에 순회하여야 합니다.

만약 한 쪽 리스트의 노드가 남는다면, 어차피 정렬되어있는 리스트이기때문에 그대로 붙이기만 하면 됩니다.

ListNode* selectedNode = nullptr;
if (node1->val < node2->val)
{
    selectedNode = node1;
    node1 = node1->next;
}
else
{
    selectedNode = node2;
    node2 = node2->next;
}
 
if (mergedHead == nullptr)
{
    mergedHead = selectedNode;
}
else
{
    lastNode->next = selectedNode;
}
 
lastNode = selectedNode;

while loop문의 내부 코드입니다.

ListNode* selectedNode = nullptr;
if (node1->val < node2->val)
{
    selectedNode = node1;
    node1 = node1->next;
}
else
{
    selectedNode = node2;
    node2 = node2->next;
}

첫 번째로는 새로운 연결 리스트에 붙일 노드를 선택합니다. 새로운 연결 리스트도 오름차순으로 정렬되어서 반환되어야 하기때문에 두 노드 중 크기가 작은 노드를 선택합니다.

if (mergedHead == nullptr)
{
    mergedHead = selectedNode;
}
else
{
    lastNode->next = selectedNode;
}

그리고 노드를 새로운 연결 리스트에 삽입합니다. 만약 새 연결 리스트의 head가 nullptr라면 첫 순회이니 그냥 삽입하고, 아니라면 tail 노드의 next 포인터로 가리키게 합니다.

lastNode = selectedNode;

그리고 방금 삽입한 노드를 tail 포인터에 저장합니다.

제출 결과

Solution 1 result

실행 속도는 4ms가 나왔으며, 다른 C++ 제출자에 비해 95% 가량의 속도가 나왔습니다.

크게 어려운 문제는 아니기 때문에 다행이 충분히 만족하는 속도가 도출되었습니다.

코드 전문
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        if (!list1 && !list2) return nullptr;
        
        ListNode* mergedHead = nullptr;
        ListNode* lastNode = nullptr;
 
        ListNode* node1 = list1;
        ListNode* node2 = list2;
 
        while (node1 && node2)
        {
            ListNode* selectedNode = nullptr;
 
            if (node1->val < node2->val)
            {
                selectedNode = node1;
                node1 = node1->next;
            }
            else
            {
                selectedNode = node2;
                node2 = node2->next;
            }
 
            if (mergedHead == nullptr)
            {
                mergedHead = selectedNode;
            }
            else
            {
                lastNode->next = selectedNode;
            }
 
            lastNode = selectedNode;
        }
 
        if (node1)
        {
            if (!mergedHead)
            {
                mergedHead = node1;
            }
            else
            {
                for (auto node = node1; node != nullptr; node = node->next)
                {
                    lastNode->next = node;
                    lastNode = node;
                }
            }
        }
 
        if (node2)
        {
            if (!mergedHead)
            {
                mergedHead = node2;
            }
            else
            {
                for (auto node = node2; node != nullptr; node = node->next)
                {
                    lastNode->next = node;
                    lastNode = node;
                }
            }
        }
 
        return mergedHead;   
    }
};

LeetCode  시리즈의 다른 게시물 보기

Thumbnail of LeetCode - 24. Swap Nodes in Pairs

주어진 연결 리스트의 근접 노드와 짝을 지어 swap 합니다.

2021년 12월 09일

Thumbnail of LeetCode - 23. Merge k Sorted Lists

정렬된 K개의 연결 리스트를 모두 하나의 연결 리스트로 합쳐야합니다.

2021년 12월 08일

Thumbnail of LeetCode - 22. Generate Parentheses

정수 N이 주어질 때 N개의 소괄호로 이뤄지는 모든 조합을 생성합니다.

2021년 12월 07일

Thumbnail of LeetCode - 21. Merge Two Sorted Lists

정렬되어있는 두 연결 리스트를 하나로 합쳐야합니다.

2021년 12월 06일

Thumbnail of LeetCode - 20. Valid Parentheses

주어진 문자열에서 열린 괄호과 닫힌 괄호가 올바르게 존재하는지 확인합니다.

2021년 12월 03일

Thumbnail of LeetCode - 19. Remove Nth Node From End of List

단방향 연결 리스트의 끝에서 N번째 노드를 제거합니다.

2021년 12월 01일

Thumbnail of LeetCode - 18. 4Sum

정수 배열 내 숫자 네 개를 더해 target 숫자를 구할 수 있는 모든 가짓수를 찾습니다.

2021년 11월 29일