Problem:
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
Analysis:
The first part of this problem is to use two pointers to trasversal all nodes of two lists. Set one to be the head of the first linked-list, and the second one to be the head of the second linked-list. Move them in the same pace until the next pointer of one of the nodes to be NULL. If the next pointer of the node of the linked-list is not NULL, truncate the reminder part of the linked-list and attach it to the first list.
The second part ot the solution is the simulation of addition. Use an int variable to take the carry of the sum of the current two nodes. After the first loop, we should continue the computation until the carry to be 0 or a new node is added to the list with value 1.
Code:
C++ (36 ms):
1 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 2 if(l1 == NULL) 3 return l2; 4 5 if(l2 == NULL) 6 return l1; 7 8 ListNode *p_cur_1 = l1; 9 ListNode *p_cur_2 = l2; 10 int carry = 0; 11 for(;; p_cur_1 = p_cur_1->next, p_cur_2 = p_cur_2->next) 12 { 13 p_cur_1->val += p_cur_2->val + carry; 14 if(p_cur_1->val >= 10) { 15 p_cur_1->val %= 10; 16 carry = 1; 17 } else 18 carry = 0; 19 20 if(p_cur_1->next == NULL || p_cur_2->next == NULL) 21 break; 22 } 23 24 if(p_cur_1->next == NULL && p_cur_2->next != NULL) { 25 p_cur_1->next = p_cur_2->next; 26 p_cur_2->next = NULL; 27 } 28 29 while(carry) { 30 if(p_cur_1->next == NULL) 31 p_cur_1->next = new ListNode(0); 32 33 p_cur_1->next->val += carry; 34 if(p_cur_1->next->val >= 10) { 35 p_cur_1->next->val %= 10; 36 carry = 1; 37 } else 38 carry = 0; 39 40 p_cur_1 = p_cur_1->next; 41 } 42 43 return l1; 44 }