Add Two Numbers
title:
#You are given two linked lists representing two
#non-negative numbers.
#The digits are stored.
#in reverse order and each of their nodes contain
#a single digit.
#Add the two numbers and
#return it as a linked list.
#Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) #Output: 7 -> 0 -> 8 # methon one:array merge sum O(n+m) # class Solution: # def addTwoNumbers(self, l1, l2): # l3 = list() # if len(l1) <= len(l2): # min_len = len(l1) # max_len = len(l2) # else: # min_len = len(l2) # max_len = len(l1) # l3 = [0 for i in range(max_len+1)] # index = int() # for i in range(min_len): # if (l1[i] + l2[i] + l3[i] <= 9): # l3[i] = l1[i] + l2[i] + l3[i] # else: # l3[i] = l1[i] + l2[i] + l3[i] - 10 # l3[i+1] = l3[i+1] + 1 # index = i + 1 # if index < len(l1): # for i in range(index,len(l1)): # if(l3[i] + l1[i] + l3[i] <= 9): # l3[i] = l1[i] + l3[i] # else: # l3[i] = l1[i] + l3[i] - 10 # l3[i+1] = l3[i+1] + 1 # else: # for i in range(index,len(l2)): # if(l3[i] + l2[i] + l3[i] <= 9): # l3[i] = l2[i] + l3[i] # else: # l3[i] = l2[i] + l3[i] - 10 # l3[i+1] = l3[i+1] + 1 # if (l3[len(l3)-1] == 0): # l3.pop() # return l3 # methon two:singel link merge sum O(n+m) # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: # @return a ListNode def addTwoNumbers(self, l1, l2): #head node dummy = ListNode(-1) first = l1 second = l2 prev = dummy tail = dummy #if beyond 10,carry = 1 carry = 0 while(first != None and second != None): if (first.val + second.val + carry <= 9): tail = ListNode(first.val + second.val + carry) carry = 0 print tail.val else: tail = ListNode(first.val + second.val - 10 + carry) carry = 1 print tail.val #tail insert prev.next = tail prev = tail first = first.next second = second.next #process remain node if first != None: while(first != None): if (first.val + carry <= 9): tail = ListNode(first.val + carry) carry = 0 print tail.val else: tail = ListNode(first.val - 10 + carry) carry = 1 print tail.val prev.next = tail prev = tail first = first.next if carry == 1: tail = ListNode(1) carry = 1 print tail.val prev.next = tail prev = tail else: while(second != None): if (second.val + carry <= 9): tail = ListNode(second.val + carry) carry = 0 print tail.val else: tail = ListNode(second.val - 10 + carry) carry = 1 print tail.val prev.next = tail prev = tail second = second.next if carry == 1: tail = ListNode(1) carry = 1 print tail.val prev.next = tail prev = tail #return head.next node return dummy.next if __name__ == '__main__': s = Solution() a = ListNode(2) b = ListNode(4) c = ListNode(3) l1 = a a.next = b b.next = c # d = ListNode(5) # e = ListNode(6) # f = ListNode(4) # l2 = d # d.next = e # e.next = f d = ListNode(9) e = ListNode(7) f = ListNode(6) g = ListNode(9) h = ListNode(9) i = ListNode(3) l2 = d d.next = e e.next = f f.next = g g.next = h h.next = i print s.addTwoNumbers(l1,l2)