给你两个非空链表,分别表明两个非负整数,它们的高低位顺序和链表顺序相反,链表中,每一个节点表明一位数,要求将两个链表相加,结果也以链表形式返回。python
假设链表都不会以 0 开头,除了 0 自己外。bash
例子:性能
输入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
解释: 342 + 465 = 807.
复制代码
Medium
优化
这道题虽然标中等难度,但实际上却比较简单,由于链表的顺序和数字的高低位顺序相反,即链表头是低位,而链表尾是高位,因此把两个链表表明的数相加,实际上就是按链表顺序,依次从头(低位)到尾(高位)对两个链表对应的节点作加法操做。因此,这道题的时间复杂度为 。spa
此外,写程序时还须要注意进位的问题,若是有进位,则须要用一个变量来标记,咱们尤为须要注意下面这样的 case:code
1
+ 9 -> 9 -> 9
= 0 -> 0 -> 0 -> 1
复制代码
在性能的优化上,我发现若是减小内存分配操做,能够极大的提高运行速度,也就是说,咱们能够利用现有链表的节点,将计算结果存储在里面,这样,整个程序基本上不须要建立新节点,你的程序必定能够跑一个好分数:内存
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 """
carry = 0
ret = last = ListNode(0)
ret.next = last.next = l1
while l1 and l2:
val = l1.val + l2.val + carry
carry = val / 10
val = val % 10
l1.val = val
l2 = l2.next
last = l1
l1 = l1.next
if l2:
last.next = l2
l1 = last.next
while l1:
val = l1.val + carry
carry = val / 10
l1.val = val % 10
last = l1
l1 = l1.next
if carry == 1:
last.next = ListNode(carry)
return ret.next
复制代码
原题连接leetcode