有希
HackerRank/Merge two sorted linked lists 본문
이 문제는 세번째 접하는건데, 아예 이 풀이로 머리가 굳어서 다른 풀이로 풀려고 하면 몸에서 사리가 나온다...
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;
}
'프로그래밍 > 알고리즘+코딩테스트' 카테고리의 다른 글
LeetCode/Permutations (0) | 2022.04.20 |
---|---|
LeetCode/Find First and Last Position of Element in Sorted Array (0) | 2022.04.12 |
HackerRank/Recursive Digit Sum (0) | 2022.04.04 |
HackerRank/Grid Challenge (0) | 2022.04.04 |
HackerRank/Caesar Cipher (0) | 2022.04.02 |