You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
/*
* 2. Add Two Numbers
* You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
*
* Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
* Output: 7 -> 0 -> 8
*/
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* addTwoNumbers(ListNode *l1, ListNode *l2) {
if (l1 == NULL || l2 == NULL)
return NULL;
int carry = 0;
ListNode *p1 = l1;
ListNode *p2 = l2;
ListNode dummy(-1);
ListNode *p3 = &dummy;
while (p1 != NULL && p2 != NULL) {
int tmp = p1->val + p2->val + carry;
carry = tmp / 10;
int bitNum = tmp % 10;
ListNode *pNode = new ListNode(bitNum);
p3->next = pNode;
p1 = p1->next;
p2 = p2->next;
p3 = p3->next;
}
while (p1 != NULL) {
int tmp = p1->val + carry;
carry = tmp / 10;
int bitNum = tmp % 10;
ListNode *pNode = new ListNode(bitNum);
p3->next = pNode;
p1 = p1->next;
p3 = p3->next;
}
while (p2 != NULL) {
int tmp = p2->val + carry;
carry = tmp / 10;
int bitNum = tmp % 10;
ListNode *pNode = new ListNode(bitNum);
p3->next = pNode;
p2 = p2->next;
p3 = p3->next;
}
if (carry != 0) {
ListNode *pNode = new ListNode(carry);
p3->next = pNode;
}
return dummy.next;
}
};
void print(ListNode *pNode)
{
ListNode *p = pNode;
while (p != NULL) {
cout << p->val << " ";
p = p->next;
}
}
int main()
{
ListNode l11(2);
ListNode l12(4);
ListNode l13(3);
ListNode l21(5);
ListNode l22(6);
ListNode l23(4);
l11.next = &l12;
l12.next = &l13;
l21.next = &l22;
l22.next = &l23;
ListNode *pret;
Solution sol;
pret = sol.addTwoNumbers(&l11, &l21);
print(pret);
return 0;
}