LeetCode【链表】2. 两数相加

题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 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')

 

你可能感兴趣的:(LeetCode刷题)