版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36697353/article/details/87281166
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
首先,自己在链表用于存储方面的表达上面,比较不会,看了看解决思路如下:
下面表示了链表的形式,这样一看,自己就觉得一目了然了。
知识补充:
个人理解,哑节点(dummy node)是初始值为NULL的节点,创建在使用到链表的函数中,可以起到避免处理头节点为空的边界问题的作用,减少代码执行异常的可能性。
也就是说,哑节点的使用可以对代码起到简化作用(省略当函数的入口参数为空时的判断)。
哑节点(dummy Node)是一个被人为创建的节点,虽然其内容为NULL,但是它在堆中有占有一定的空间。
哑节点的使用可以避免边界问题的处理,达到简化代码与减少代码出错可能性的目的。
算法:
就像你在纸上计算两个数字的和那样,我们首先从最低有效位也就是列表l1和l2的表头开始相加。由于每位数字都应当处于0...9的范围内,我们计算两个数字的和时可能会出现溢出。例如, 5+7=12。在这种情况下,我们会将当前位的数值设置为2,并将进位carry=1带入下一次迭代。进位carry必定是0或1,这是因为两个数字相加(考虑到进位)可能出现的最大和为9+9+1=19
伪代码如下:
- 将当前节点初始化为返回列表的哑结点
- 将进位carry初始化为0
- 将p和q分别初始化为列表l1和l2的头部
- 遍历列表了l1和l2直至到达它们的尾端
- 将x设为节点p的值,如果p已经到达l1的末尾,则将其值设为0。
- 将y设为节点q的值,如果q已经到达l2的末尾,则将其值设为0。
- 设定 sum = x + y + carry
- 更新进位的值, carry = sum/10
- 创建一个数值为(sum mod 10)的新结点,并将其设置为当前节点下的一个结点,然后将当前结点前进到下一个结点。
- 同时,将p和q前进到下一个结点
- 检查 carry = 1carry=1 是否成立,如果成立,则向返回列表追加一个含有数字 11 的新结点。
- 返回哑结点的下一个结点。
python 代码如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
re = ListNode(0)
r =re
carry = 0
while(l1 or l2):
x = l1.val if l1 else 0
y = l2.val if l2 else 0
s = carry + x + y
carry = s//10
r.next = ListNode(s%10)
r = r.next
if(l1 != None):
l1 = l1.next
if(l2 != None):
l2 = l2.next
if(carry >0):
r.next = ListNode(1)
return re.next
总结:
链表知识还是掌握的不是很深,理解的也不是很熟,需要多加练习