給你兩個非空鏈表,分別表明兩個非負整數,它們的高低位順序和鏈表順序相反,鏈表中,每一個節點表明一位數,要求將兩個鏈表相加,結果也以鏈表形式返回。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