leetcode 2 two-sum (两数相加)

题目要求

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
leetcode 2 two-sum (两数相加)_第1张图片

解题分析

由于他是倒叙存储的,所以实际上省去了很多的麻烦,我们可以通过一个关系式来进行计算:
s = x + y + c a r r y s = x + y + carry s=x+y+carry
说明一下,这里的x,y分别是第一,二个链表的当前值,carry意思是有无进位,0表示没有进位,1表示有进位。这样我们就可以得到当前两个链表元素的和,一次迭代直到两个链表为空即可。

有几点需要注意,因为两个链表可能不是等长,所以当一个链表结束,另一个链表还有元素的时候,我们就把已经结束的链表节点的值置为0,继续使用上面的公式计算,还有一点很重要,当运算结束后(即两个链表都为空时)我们还要进行一次进位的判断,这里非常非常重要!!!

主要代码python

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        dummy = ListNode(0)
        l3 = dummy
        carry =  0
        while l1 or l2:
            # 记录l1的值,并移动
            x = l1.val if l1 else 0
            l1 = l1.next
            # 记录l2的值,并移动
            y = l2.val if l2 else 0
            l2 = l2.next
            s = carry+ x + y
            # 进位除法判断, 本位取余数判断
            pop = s//10
            l3.next = ListNode(s%10)
            l3 = l3.next 
        if pop > 0:
            l3.next = ListNode(1)
        return dummy.next

复杂度分析

时间复杂度:O(max(m,n)),假设 m 和 n 分别表示 l1 和 l2 的长度,上面的算法最多重复 max(m,n) 次。
空间复杂度:O(max(m,n)), 新列表的长度最多为 max(m,n)+1。

原题链接:https://leetcode-cn.com/problems/two-sum/

你可能感兴趣的:(leetcode题解)