(출처) https://leetcode.com/problems/add-two-numbers/
문제 자체는 어려워 보이지 않았다.
입력으로 들어온 수들을 알맞게 더하고 자리수 옮김만 조심해서 리턴해주면 되니까 쉽게 풀 수 있어 보였다.
그런데 막상 로직을 구현해 보려고 하니 포인터를 직접 조작하면서 계산하는 것부터 머리가 복잡해지고 코드를 짜내려 가는 게 마냥 쉽지만은 않았다.
뭐 결국 어찌어찌 짜내서 정답을 받긴 했지만 코드도 복잡하고, 또 복잡해진 만큼 표현도 명확하지 않고.. 코드를 짜는 시간 자체도 오래 걸렸고 솔브 했어도 굉장히 찝찝함이 많이 남은 문제였다.
한번 다른 사람들이 올린 코드를 찾아보았더니 정말 간결하더라. 또 내용도 명확하고.
이렇게 뭔가 간단히 핵심만 남겨놓은 코드들을 막상 봤을 때는 아니 이 정도는 나도 쉽게 할 수 있을 것 같은데? 어렵지 않은데? 하다가도 막상 직접 코드를 쓰다 보면 왜 나는 코드를 저런 식으로 못 짜는 거지하면서 금세 내 수준을 깨닫게 된다..
아무튼 Good Solution으로 올라온 다른 분의 풀이를 읽어봤는데 배울 점이 많은 것 같아서 좀 남겨놓고 둬놨다 보고 싶어서 글을 올린다.
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
bool digit = false;
bool l1_flag = false, l2_flag = false, flag = false;
ListNode* first = new ListNode(0);
ListNode* list = first;
while(!(l1_flag && l2_flag && !digit)) {
int a = 0, b = 0;
if(l1_flag) a = 0;
else a = l1->val;
if(l2_flag) b = 0;
else b = l2->val;
int addTwo = a + b;
if(digit) {
addTwo++;
digit = false;
}
if (addTwo >= 10) {
addTwo %= 10;
digit = true;
}
list->val = addTwo;
if(l1->next == nullptr) l1_flag = true;
if(l2->next == nullptr) l2_flag = true;
if(!l1_flag) l1 = l1->next;
if(!l2_flag) l2 = l2->next;
if (!(l1_flag && l2_flag && !digit) ) {
ListNode * temp = new ListNode();
list->next = temp;
list = list->next;
}
}
return first;
}
};
int main() {
ListNode a = ListNode(9);
ListNode b = ListNode(9, &a);
ListNode c = ListNode(9, &b);
ListNode a2 = ListNode(9);
ListNode b2 = ListNode(9, &a2);
ListNode c2 = ListNode(9, &b2);
ListNode d2 = ListNode(9, &c2);
Solution solution;
ListNode *result = solution.addTwoNumbers(&c,&d2);
while(result != NULL) {
cout << result->val << " ";
result = result->next;
}
}
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int sum=0;
ListNode *l3=NULL;
ListNode **node=&l3;
while(l1!=NULL||l2!=NULL||sum>0)
{
if(l1!=NULL)
{
sum+=l1->val;
l1=l1->next;
}
if(l2!=NULL)
{
sum+=l2->val;
l2=l2->next;
}
(*node)=new ListNode(sum%10);
sum/=10;
node=&((*node)->next);
}
return l3;
}
};