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)

  

posted @ 2015-02-03 09:36  choles  阅读(170)  评论(0编辑  收藏  举报