package com.interview.linklist;
/**
* http://www.geeksforgeeks.org/sum-of-two-linked-lists/
* Test case
* Either of list is null
* Size of list1 is greater, equal or smaller than list2
* Add with carry in main
* Add with carry in remaining
*/
public class AddNumberRepresentedByLinkList {
private int carry = 0;
private Node addWithCarry(Node head1, Node head2){
if(head1 == null){
return null;
}
Node result = Node.newNode(0);
result.next = addWithCarry(head1.next, head2.next);
int r = head1.data + head2.data + carry;
result.data = r % 10;
carry = r / 10;
return result;
}
private Node addRemaining(Node start, Node stop){
if(start != stop){
Node result = Node.newNode(0);
result.next = addRemaining(start.next , stop);
result.data = (start.data + carry)%10;
carry = (start.data + carry)/10;
return result;
}else{
return null;
}
}
public Node add(Node head1, Node head2){
if(head1 == null || head2 == null){
throw new IllegalArgumentException();
}
LinkList ll = new LinkList();
int size1 = ll.size(head1);
int size2 = ll.size(head2);
Node larger = null;
Node smaller = null;
if(size1 >= size2){
larger = head1;
smaller = head2;
}else{
larger = head2;
smaller = head1;
}
int diff = Math.abs(size1 - size2);
Node largerStart = larger;
while(diff > 0){
largerStart = largerStart.next;
diff--;
}
Node result = addWithCarry(largerStart,smaller);
Node result1 = addRemaining(larger,largerStart);
if(carry != 0){
Node top = Node.newNode(carry);
result1 = ll.addAtFront(top, result1);
}
if(result1 != null){
Node tail = result1;
while(tail.next != null){
tail = tail.next;
}
tail.next = result;
return result1;
}
return result;
}
public static void main(String args[]){
LinkList ll = new LinkList();
Node head = null;
head = ll.addNode(9, head);
head = ll.addNode(4, head);
Node head1 = null;
head1 = ll.addNode(3, head1);
head1 = ll.addNode(1, head1);
head1 = ll.addNode(2, head1);
AddNumberRepresentedByLinkList anr = new AddNumberRepresentedByLinkList();
Node result = anr.add(head,head1);
ll.printList(result);
}
}