public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//edge cases
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.next == null && l1.val == 0) return l2;
if(l2.next == null && l2.val == 0) return l1;
//build first nodes for final list
// [PREV]-->NULL
// ^
// |
// |
// prevHead: pointer to save pointer to beginning of our result list
ListNode prev = new ListNode(-1);//start as a prehead
ListNode prevHead = prev;
boolean remainderExists = false;
int remainder = 0;//This will only be between 0-9
while(l1 != null || l2 != null || remainderExists){// if we finish any of the numbers stop
//Store operable data
int val1 = (l1 != null) ? l1.val : 0;
int val2 = (l2 != null) ? l2.val : 0;
int totalSum = 0;
if(remainderExists) totalSum = val1 + val2 + 1;
else totalSum = val1 + val2;
//Build new node to append to result list
ListNode newNode = new ListNode(-1);
if(totalSum <= 9){//no remainder created
remainderExists = false;
newNode.val = totalSum;
prev.next = newNode;
prev = newNode;
}else{//remainder created
remainderExists = true;
//take away remainder from sum
totalSum -= 10;
newNode.val = totalSum;
prev.next = newNode;
prev = newNode;
}
//STEP in both l1 & l2
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
return prevHead.next;
}