/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverse(ListNode head) { ListNode prev = null; ListNode next = null; ListNode current = head; while(current != null){ next = current.next; current.next = prev ; prev = current; current = next; } return prev; } public ListNode addTwoNumbers(ListNode l1, ListNode l2) { //reverse the ll ListNode curr1 = reverse(l1); ListNode curr2 = reverse(l2); //make a dummy head for answer LL ListNode dummyhead = new ListNode(-1); ListNode dummy = dummyhead; int carry = 0; //add two numbers like normal while(curr1 != null && curr2 != null){ int val = curr1.val + curr2.val + carry ; carry = val/10; val = val%10; ListNode temp = new ListNode(val); dummy.next = temp; dummy = dummy.next; curr1 = curr1.next; curr2 = curr2.next; } //if one LL ends add the rest of the number of the other LL along with carry while(curr1 != null){ int val = curr1.val + carry ; carry = val/10; val = val%10; ListNode temp = new ListNode(val) ; dummy.next = temp; dummy = dummy.next; curr1 = curr1.next; } while(curr2 != null){ int val = curr2.val + carry ; carry = val/10; val = val%10; ListNode temp = new ListNode(val) ; dummy.next = temp; dummy = dummy.next; curr2 = curr2.next; } //if all numbers are done and still any carry remains make a new node and add to the LL if(carry >0){ ListNode temp = new ListNode(carry) ; dummy.next = temp; dummy = dummy.next; } //re-reverse the final answer LL return reverse(dummyhead.next); } }