https://leetcode.com/problems/add-two-numbers-ii/submissions/
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7
위의 문제와 같은데, reverse 조건이 붙지 않았다.
푸는 과정이 좀 더 길어졌을 뿐이다. 우선 두 개의 list 들을 reverse 시키고
3 4 2 7
4 6 5
이 둘을 더하면 된다. 그러면 7 0 8 7 이 나온다.
그리고 결과를 다시 뒤집는다.
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* prev = l1;
ListNode* cur = l1->next;
l1->next = NULL;
while(cur)
{
ListNode* temp = cur->next;
cur->next = prev;
prev = cur;
cur = temp;
}
ListNode* reverseL1 = prev;
prev = l2;
cur = l2->next;
l2->next = NULL;
while(cur)
{
ListNode* temp = cur->next;
cur->next = prev;
prev = cur;
cur = temp;
}
ListNode* reverseL2 = prev;
int carry = 0;
int l1Val = 0;
int l2Val = 0;
ListNode* dummy = new ListNode(0);
ListNode* ans = dummy;
while(reverseL1 || reverseL2 || carry == 1)
{
if(reverseL1 != NULL)
{
l1Val = reverseL1->val;
reverseL1= reverseL1->next;
}
else l1Val = 0;
if(reverseL2 != NULL)
{
l2Val = reverseL2->val;
reverseL2= reverseL2->next;
}
else l2Val = 0;
dummy->next = new ListNode((l1Val + l2Val + carry) % 10);
carry = (l1Val + l2Val + carry) / 10;
dummy = dummy->next;
}
if(ans->next == NULL || ans->next->next == NULL) return ans->next;
prev = ans->next;
cur = ans->next->next;
ans->next->next = NULL;
while(cur)
{
ListNode* temp = cur->next;
cur->next = prev;
prev = cur;
cur = temp;
}
return prev;
}
};
뒤집는 과정을 함수로 빼면 좋았을 거 같다.
Runtime: 60 ms, faster than 11.22% of C++ online submissions for Add Two Numbers II.
Memory Usage: 71 MB, less than 75.15% of C++ online submissions for Add Two Numbers