[LeetCode] 2. Add Two Numbers 題解

問題描述

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

假設鏈表都不會以 0 開頭,除了 0 自己外。bash

例子:性能

輸入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出: 7 -> 0 -> 8
解釋: 342 + 465 = 807.
複製代碼

問題難度

Medium優化

解題思路

這道題雖然標中等難度,但實際上卻比較簡單,由於鏈表的順序和數字的高低位順序相反,即鏈表頭是低位,而鏈表尾是高位,因此把兩個鏈表表明的數相加,實際上就是按鏈表順序,依次從頭(低位)到尾(高位)對兩個鏈表對應的節點作加法操做。因此,這道題的時間複雜度爲 O(n)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

相關文章
相關標籤/搜索