Add two numbers represented by linked lists | Set 1 - GeeksforGeeks
Given two numbers represented by two lists, write a function that returns sum list. The sum list is list representation of addition of two input numbers.
Example 1
Given two numbers represented by two lists, write a function that returns sum list. The sum list is list representation of addition of two input numbers.
Example 1
Input: First List: 5->6->3 // represents number 365
Second List: 8->4->2 // represents number 248 Output
Resultant list: 3->1->6 // represents number 613
Input: First List: 7->5->9->4->6 // represents number 64957 Second List: 8->4 // represents number 48 Output Resultant list: 5->0->0->5->6 // represents number 65005
Traverse both lists. One by one pick nodes of both lists and add the values. If sum is more than 10 then make carry as 1 and reduce sum. If one list has more elements than the other then consider remaining values of this list as 0. Following is Java implementation of this approach.
http://yuanhsh.iteye.com/blog/2181044
/* Adds contents of two linked lists and return the head node of resultant list */
struct
node* addTwoLists (
struct
node* first,
struct
node* second)
{
struct
node* res = NULL;
// res is head node of the resultant list
struct
node *temp, *prev = NULL;
int
carry = 0, sum;
while
(first != NULL || second != NULL)
//while both lists exist
{
// Calculate value of next digit in resultant list.
// The next digit is sum of following things
// (i) Carry
// (ii) Next digit of first list (if there is a next digit)
// (ii) Next digit of second list (if there is a next digit)
sum = carry + (first? first->data: 0) + (second? second->data: 0);
// update carry for next calulation
carry = (sum >= 10)? 1 : 0;
// update sum if it is greater than 10
sum = sum % 10;
// Create a new node with sum as data
temp = newNode(sum);
// if this is the first node then set it as head of the resultant list
if
(res == NULL)
res = temp;
else
// If this is not the first node then connect it to the rest.
prev->next = temp;
// Set prev for next insertion
prev = temp;
// Move first and second pointers to next nodes
if
(first) first = first->next;
if
(second) second = second->next;
}
if
(carry > 0)
temp->next = newNode(carry);
// return head of the resultant list
return
res;
}
- public ListNode addLinkedList(ListNode a, ListNode b) {
- ListNode result = new ListNode(0);
- ListNode dummy = result;
- int carry = 0;
- while(a!=null || b!=null) {
- int sum = carry + ((a!=null)?a.val:0) + ((b!=null)?b.val:0);
- carry = sum / 10;
- result.next = new ListNode(sum%10);
- result = result.next;
- if(a!=null) a=a.next;
- if(b!=null) b=b.next;
- }
- if(carry>0) {
- result.next = new ListNode(carry);
- }
- return dummy.next;
- }