프로그래밍/알고리즘+코딩테스트
LeetCode/2. Add Two Numbers
sleepyotter.
2022. 2. 16. 17:08
342라는 숫자가 있으면 1의 자리부터 해서 노드가 2->4->3 으로 연결되어 있다. 주어진 두 개의 노드를 1의 자리부터 편안하게 더해가면 된다. leading zero도 없다고 하니 신경쓸 필요 없이 더하면 된다.
다만, 문제의 함정은 두 리스트의 길이가 항상 같지는 않다는 것. 그러면 2가지 케이스로 나뉜다.
1. 두 리스트의 길이가 같을때
한 쪽의 next 포인터가 nullptr이 아닐때까지 계속 이동하면서 더하면 된다.
2. 두 리스트의 길이가 다를때
1번의 방법을 이용한 후에 남은 쪽을 쭉 붙여주면 된다.
먼저 while문으로 두 녀석의 합을 구해서 쭉 붙인다. up은 이전 자리수의 합이 10이 넘을 경우 true가 된다. 처음에는 false로 초기화
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* ret = new ListNode;
ListNode* cur = ret;
bool up=false;
//둘 다 아직 끝이 아닐경우
while(true)
{
int sum = l1->val + l2->val;
if(up)
{
sum+=1;
up=false;
}
if(sum>=10)
{
up=true;
sum%=10;
}
cur->val = sum;
if(l1->next == nullptr || l2->next == nullptr)
break;
l1 = l1->next;
l2 = l2->next;
ListNode* nextNode = new ListNode;
cur->next = nextNode;
cur = nextNode;
}
이후 어느 한 쪽이 살아있는지 판단한다.
//한 쪽만 살아 있는 경우
if(l1->next!=nullptr && l2->next==nullptr)
{
while(l1->next!=nullptr)
{
l1 = l1->next;
ListNode* nextNode= new ListNode;
cur->next = nextNode;
cur = nextNode;
if(up)
{
cur->val = l1->val + 1;
if(cur->val >= 10)
{
cur->val %=10;
up = true;
}
else
{
up = false;
}
}
else
{
cur->val = l1->val;
}
}
}
else if(l1->next==nullptr && l2->next!=nullptr)
{
while(l2->next!=nullptr)
{
l2 = l2->next;
ListNode* nextNode= new ListNode;
cur->next = nextNode;
cur = nextNode;
cur->val = l2->val;
if(up)
{
cur->val += 1;
if(cur->val>=10)
{
cur->val %= 10;
up = true;
}
else
{
up = false;
}
}
}
}
이제 한 단계만 더 하면 된다. 바로 999999와 1을 더하는 경우에는 한 쪽이 끝난 후에도 계속해서 up이 true가 되어 마지막에는 10000000이 된다. 즉, 자리수가 바뀐다. 마지막에도 up이 true인지 확인하는 작업을 한다.
if(up)
{
ListNode* nextNode = new ListNode;
nextNode->val = 1;
cur->next = nextNode;
cur = nextNode;
}
return ret;
}
위의 3단계를 이어서 복붙하면 코드 완성이다.