package com.interview.algorithms.list;
import com.interview.basics.model.collection.list.LinkedList;
import com.interview.basics.model.collection.list.Node;
/**
* Created_By: stefanie
* Date: 14-7-10
* Time: 下午10:07
*/
public class C3_11_ListNumberAdd {
public static LinkedList<Integer> add(LinkedList<Integer> number1, LinkedList<Integer> number2){
LinkedList<Integer> sum = new LinkedList<>();
sum.add(1);
Node<Integer> p = sum.getHead();
Node<Integer> num1 = number1.getHead();
Node<Integer> num2 = number2.getHead();
int carry = 0;
// while(num1 != null && num2 != null){
// carry = addNode(num1.item, num2.item, carry, p);
// num1 = num1.next;
// num2 = num2.next;
// }
// while(num1 != null){
// carry = addNode(num1.item, 0, carry, p);
// num1 = num1.next;
// }
// while(num2 != null){
// carry = addNode(0, num2.item, carry, p);
// num2 = num2.next;
// }
while(num1 != null || num2 != null){
int i = num1 == null? 0 : num1.item;
int j = num2 == null? 0 : num2.item;
carry = addNode(i, j, carry, p);
p = p.next;
num1 = num1 == null? null : num1.next;
num2 = num2 == null? null : num2.next;
}
if(carry > 0){
addNode(0, 0, carry, p);
}
sum.remove(0);
return sum;
}
private static int addNode(Integer num1, Integer num2, int carry, Node<Integer> current){
int sumNumber = num1 + num2 + carry;
Node<Integer> node = new Node<>(sumNumber % 10);
current.next = node;
return sumNumber / 10;
}
public static LinkedList<Integer> addRecursive(LinkedList<Integer> number1, LinkedList<Integer> number2){
LinkedList<Integer> sum = new LinkedList<>();
Node<Integer> head = addList(number1.getHead(), number2.getHead(), 0);
sum.setHead(head);
return sum;
}
private static Node<Integer> addList(Node<Integer> num1, Node<Integer> num2, int carry){
if(num1 == null && num2 == null && carry == 0) return null;
Node<Integer> result = new Node<Integer>(carry);
int sum = carry;
if(num1 != null) sum += num1.item;
if(num2 != null) sum += num2.item;
result.item = sum % 10;
if(num1 != null || num2 != null){
Node<Integer> more = addList(num1 == null? null: num1.next,
num2 == null? null: num2.next,
sum / 10);
result.next = more;
}
return result;
}
}