ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode 题库练习 2

2019-06-11 21:03:58  阅读:216  来源: 互联网

标签:ListNode num1 练习 LeetCode 链表 题库 next 节点 进位


题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

分析题目

题目中给出了链表的定义,链表有两个成员,一个 val 表示当前节点所存储的值,next 表示指向的下一个节点,显然,当 next 为 None 时,说明链表结束:

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

解法1:为了得到两个数的和,可以先将两个链表表示的数字计算出来,得到和后再以链表的形式返回。
解法2:每个链表的节点都是从低位到高位的,直接将对应节点位置的两数相加,存放到和的链表中,若出现进位,则置进位标志位为 1,当其中一个链表没有更多的节点时,用 0 表示,最后以链表的形式返回和。

解题

我采用的是第 2 种方法:

nodestart = ListNode(0)
result = nodestart

l1start = ListNode(0)
l1start.next = l1
l2start = ListNode(0)
l2start.next = l2

nextLevelup = False  #  carry flag

首先构造了 nodestart = ListNode(0) 准备存放第一个数,将结果 result 指向该节点,然后分别构造 l1startl2start,分别指向传入的两个链表(这里的构造形式和后面的循环有关)。接着对每一位进行相加:

num1 = l1start.val if l1start is not None else 0
num2 = l2start.val if l2start is not None else 0
if nextLevelup:
    num1 += 1
    nextLevelup = False

num1 += num2
if num1 > 9:
    nextLevelup = True
    num1 -= 10
result.next = ListNode(num1)
result = result.next

取出加数和被加数相应节点的数,分别设为 num1 和 num2,若上一次相加时,有进位发生,加将 num1 加 1,并加 num1 和 num2 相加,和存储在 num1 中,若 num1 > 9,说明发生了进位,需要进行进位的处理。最后用 num1 构造一个新的节点,移动 result 指针指向该节点。

这里的代码是在循环中执行的,当两个链表指针 l1start 和 l2start 的 next 都为 None 时,循环结束。

解题完整代码:github 仅供参考。

上面的解题过程可以进一步优化,我们已经用 num1 来存储最后的和了,可以再将 l1start 节点中的值修改成最后得到的 num1,这样可以避免创建过多的新节点,减少内存使用。

解题小结

链表 ListNode 中的每一个节点实际上表示的是数字的每一位,根据加法的运算规则,对两个链表的每一位相加即可得到最终的和。

想象:对于每一位的加法来说,实际上可以同时计算几个位数的加法,比如同时进行 4 对节点的相加,例如:1535 + 1329,若并行计算 4 位的加法,得到每一位上的和分别为 2 8 5 4,但最后一位出现进位,导致结果更新为 2864,或者 1545 + 1491,并行计算,得每一位上的和为 2 9 3 6,第 3 位出现进位,导致第 2 位进位,最终导致第 1 位进位,结果更新为 3036。用这样的原理是不是就可以实现硬件级别的加速呢?

相似题目

在 LeetCode 题库中的第 9 题,判断一个数字是否是回文数。在不将整数转为字符串的前提下,可以用上面的思想来进行解题。

方法:构造一个数组,数组从 0 开始,存储数字的低位到高位:

xlist = []
while x > 0:
    x, tmp = divmod(x, 10)
    xlist.append(tmp)

如 13432,在数组中就是 [1, 3, 4, 3, 2],然后判断第 i 位,与第 xlistLen - 1 - i 位是否相等,若对于所有的 i 都相等,则该数字是回文数,否则就不是回文数。

xlen = len(xlist)
for i in range(xlen // 2):
    if xlist[i] != xlist[xlen - 1 - i]:
        return False
return True

事实上,构造数组的那部分代码就和将整数转换为字符串是一样的效果,不过这里是用求余的方法得到各个位数上的数的。

该部分的完整代码地址:github 仅供参考。

标签:ListNode,num1,练习,LeetCode,链表,题库,next,节点,进位
来源: https://www.cnblogs.com/brifuture/p/11005953.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有