题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
单纯的链表题目,因为是倒序着的,所以只需要从头开始遍历相加就可以,【2 -> 4 -> 3,5 -> 6 -> 4 】从2和5开始相加,如果有进位就加到后面一位的相加中。要考虑的是当链表长度不相同的时候,【2 -> 4 -> 3,5 -> 6 】 这个时候最后一位就要单独判断一下。
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
class Solution(object):
def addTwoNumbers(self, l1, l2):
head = None # 链表头
tail = None # 链表尾部,方便插入的时候不需要遍历
carry = 0
while l1 or l2:
l1_v = l1.val if l1 else 0
l2_v = l2.val if l2 else 0
val = l1_v + l2_v + carry
carry = val // 10
val = val % 10
node = ListNode(val)
if not head:
head = node
tail = head
else:
tail.next = node
tail = node
if l1:
l1 = l1.next
if l2:
l2 = l2.next
if carry>0:
tail.next = ListNode(1)
return head
''''''''''' 测试使用 '''''''''''''''
def get_list(arr):
l1 = ListNode(arr[0])
head = l1
for i in range(1,len(arr)):
tmp = ListNode(arr[i])
l1.next=tmp
l1=tmp
return head
def print_linked(l1):
while l1:
print(l1.val,end='')
l1=l1.next
if __name__ == '__main__':
l1 = get_list([2,4,3])
l2 = get_list([5,6,4])
s = Solution()
r = s.addTwoNumbers(l1,l2)
print_linked(r)
print(' 708')
print("---------------")
l1 = get_list([8,1,7])
l2 = get_list([3,2])
s = Solution()
r = s.addTwoNumbers(l1, l2)
print_linked(r)
print(' 147')
print("---------------")
l1 = get_list([8, 2])
l2 = get_list([0])
s = Solution()
r = s.addTwoNumbers(l1, l2)
print_linked(r)
print(' 82')