# Two Sum: Input array is sorted

# Two Sum: Input array is sorted

Similar to Question [1. Two Sum], except that the input array is already sorted in ascending order.

You are given two **non-empty** linked lists representing two non-negative integers. The digits are stored in **reverse order**, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

**Example 1**

Input: l1 = [2,4,3], l2 = [5,6,4] Output: [7,0,8] Explanation: 342 + 465 = 807.

**Example 2**

Input: l1 = [0], l2 = [0] Output: [0]

**Example 3**

Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] Output: [8,9,9,9,0,0,0,1]

Of course we could still apply the [Hash table] approach, but it costs us O(n) extra space, plus it does not make use of the fact that the input is already sorted.

**O(n log n) runtime, O(1) space – Binary search:**

For each element x, we could look up if target – x exists in O(log n) time by applying binary search over the sorted array. Total runtime complexity is O(n log n).

**Solution in Java**

public class Solution { // example in leetcode book public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode(0); ListNode p = l1, q= l2, curr = dummyHead; int carry = 0; while (p != null || q!= null) { int x = (p != null) ? p.val : 0; int y = (q != null) ? q.val : 0; int digit = carry + x + y; carry = digit / 10; curr.next = new ListNode(digit % 10); curr = curr.next; if (p != null) p = p.next; if (q != null) q = q.next; } if (carry > 0) { curr.next = new ListNode(carry); } return dummyHead.next; } }

**Solution in Python**

class ListNode(object): def __init__(self, x): self.val = x self.next = None

class Solution(object): def addTwoNumbers(self, l1, l2): carry = 0 # dummy head head = curr = ListNode(0) while l1 or l2: val = carry if l1: val += l1.val l1 = l1.next if l2: val += l2.val l2 = l2.next curr.next = ListNode(val % 10) curr = curr.next carry = int(val / 10) if carry > 0: curr.next = ListNode(carry) return head.next