관리 메뉴

有希

HackerRank/Merge two sorted linked lists 본문

프로그래밍/알고리즘+코딩테스트

HackerRank/Merge two sorted linked lists

有希. 2022. 4. 5. 23:21

이 문제는 세번째 접하는건데, 아예 이 풀이로 머리가 굳어서 다른 풀이로 풀려고 하면 몸에서 사리가 나온다...

1. 첫번째와 두번째 Node중 작은 값을 시작값으로 정한다.

2. 두 노드중 작은 쪽의 값을 계속해서 이어 붙인다.

3. 두 노드 중 한 쪽이 먼저 끝나면 남은 쪽을 쭉 이어 붙인다.

임베디드 관련해서 메모리를 한톨이라도 더 아끼려면 양 쪽의 노드에서 값만 추출해오고 추출당한 녀석은 delete로 밀어버리거나 하는 최적화가 생각나는데, 데스크탑 환경에서는 굳이? 싶다.

SinglyLinkedListNode* mergeLists(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    
    //list1 pointer
    SinglyLinkedListNode* ptr1 = head1;
    SinglyLinkedListNode* ptr2 = head2;
    SinglyLinkedListNode* newOne;
    if(ptr1->data <= ptr2->data)
    {
        newOne = new SinglyLinkedListNode(ptr1->data);
        ptr1 = ptr1->next;         
    }
    else
    {
        newOne = new SinglyLinkedListNode(ptr2->data);
        ptr2 = ptr2->next;
    }
    SinglyLinkedListNode* ret = newOne;

    //merge two
    while(ptr1 && ptr2)
    {
        if(ptr1->data <= ptr2->data)
        {
            SinglyLinkedListNode* temp = new SinglyLinkedListNode(ptr1->data);
            newOne->next = temp;
            newOne = newOne->next;
            ptr1 = ptr1->next;
        }
        else
        {
            SinglyLinkedListNode* temp = new SinglyLinkedListNode(ptr2->data);
            newOne->next = temp;
            newOne = newOne->next;
            ptr2 = ptr2->next;
        }
    }
    
    //if ptr1 is not end
    if(ptr1)
    {
        while(ptr1)
        {
            SinglyLinkedListNode* temp = new SinglyLinkedListNode(ptr1->data);
            newOne->next = temp;
            newOne = newOne->next;
            ptr1 = ptr1->next;
        }
    }
    //ptr2 is not end
    else {
        while(ptr2)
        {
            SinglyLinkedListNode* temp = new SinglyLinkedListNode(ptr2->data);
            newOne->next = temp;
            newOne = newOne->next;
            ptr2 = ptr2->next;            
        }
    }
    
    return ret;
}