[LeetCode] 2. Add Two Numbers 题解

栏目: 数据库 · 发布时间: 6年前

内容简介:给你两个假设链表都不会以 0 开头,除了 0 本身外。

给你两个 非空 链表,分别代表两个非负整数,它们的高低位顺序和链表顺序相反,链表中,每个节点代表一位数,要求将两个链表相加,结果也以链表形式返回。

假设链表都不会以 0 开头,除了 0 本身外。

例子:

输入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
解释: 342 + 465 = 807.
复制代码

问题难度

Medium

解题思路

这道题虽然标中等难度,但实际上却比较简单,因为链表的顺序和数字的高低位顺序相反,即链表头是低位,而链表尾是高位,所以把两个链表代表的数相加,实际上就是按链表顺序,依次从头(低位)到尾(高位)对两个链表对应的节点做加法操作。所以,这道题的时间复杂度为 。

此外,写程序时还需要注意进位的问题,如果有进位,则需要用一个变量来标记,我们尤其需要注意下面这样的 case:

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
复制代码

原题链接


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程式之美-微軟技術面試心得

程式之美-微軟技術面試心得

編程之美小 / 悅知文化 / 2008.06.20 / 490元

書內容分為以下幾個部分: ▓ 遊戲之樂:從遊戲和其他有趣問題出發,化繁為簡,分析總結。 ▓ 數字之魅:程式設計的過程實際上就是和數字及字元打交道的過程。這一部分收集了一些這方面的有趣探討。 ▓ 結構之法:彙集了常見的對字串、鏈表、佇列,以及樹進行操作的題目。 ▓ 數學之趣:列舉了一些不需要寫具體程式的數學問題,鍛煉讀者的抽象思考能力。 ▓ 書中絕大部分題目都提供了詳細......一起来看看 《程式之美-微軟技術面試心得》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换