题目在这:https://leetcode-cn.com/problems/add-two-numbers/
题目分析:
题目应该是比较好理解的,就是竖着对应相加就行了。
唯一注意的地方,平常做加法的进位是往左边。本题是依次往右边。
思路分析:
有几种方法 先说一下。
1.直接法~ :直接相加,相加的过程中考虑进位问题
2.补齐法~:先把两个列表补齐到同样长度。然后再相加,过程中考虑进位问题。
3.花里胡哨法: 将链表全变成普通列表。列表相加。然后考虑进位。再变回链表返回。
这里采用一个超容易理解的方法: 先相加。最后考虑进位问题。
而且会了这个方法。其他方法也就会了。
对于学过数据结构课本,但没有在leetcode上写过题的小伙伴:
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
L3 = ListNode()
表示建立了只有一个节点的链表 L3。
大致思路就是 将L1和L2相加 ,存到L3里。最后考虑L3的进位问题。
各种情况分析:
一.
当L1和L2都指向最后的时候:
即:
L1 == None and L2 == None
这时候显然遍历结束。
二.
当L1没结束且L2没结束的时候。
显然要计算L1 + L2的值,放到L3里
l3.val = l1.val + l2.val
然后将L1和L2的指针往后挪。
l1 = l1.next
l2 = l2.next
L3继续开辟新的节点,然后把L3指针往后挪。
l3.next = ListNode()
l3 = l3.next
这里有一个需要注意的点,如果说L1和L2往后挪了之后都指向了None,那么也就是不需要再相加了,也就不需要再开辟L3的新节点了。
if l1 == None and l2 == None:
continue
else:
l3.next = ListNode()
l3 = l3.next
三.
L1已经结束但L2没有结束的时候。
显然只需要吧L2的值给L3。
然后L2指针往后挪。
看看挪动之后的L2是不是已经指向None了,如果已经指向None则不需要在开辟新的L3节点了
elif l1 == None and l2 != None:
l3.val = l2.val
l2 = l2.next
if l2 != None:
l3.next = ListNode()
l3 = l3.next
四.
L1没有结束但L2已经结束的时候。
同理第三种情况。把L1剩下的给L3就行了。
重复上面的四种情况。直到L1和L2都遍历完了指向了None。
这时候得到一个全新的链表L3,但还没考虑进位的情况。
我们从头开始遍历L3 ,如果当前L3所指向的值是大于9的,就让他进位。
采用 divmod(a,b) 该函数计算a除b 返回 商和余数
temp,p.val = divmod(p.val,10) # 商给temp,用于进位 。余数给了p所指向的值
这里也要考虑一个点。例如我们得到了还没有进位的链表 [3,2,5,10]
这里的最后一位数10需要进位,所以在程序中需要判断当前是不是最后一位,如果是最后一位,则需要L3开辟新的节点。
其他的点解释都在注释里了。
进位的代码:
if l1 == None and l2 == None: # 此时已得到没考虑进位的列表L3
while True:
if p.val > 9: # 大于9则进位
if p.next == None: # 看当前是否已经是最后一位
p.next = ListNode() # 开辟新的L3节点
temp,p.val = divmod(p.val,10) # 取商和余数 余数给当前
p.next.val += temp # 将商加到下一位
temp = 0 # 每次运算完成都重置商为0
p = p.next
if p == None:
return l # 遍历完成,返回
完整代码:
l3 = ListNode()
p= l3 # p指针用于第二次遍历解决进位问题
l = p # l指针用于返回答案
while True:
if l1 == None and l2 == None: # 此时已得到没考虑进位的列表L3
while True:
if p.val > 9:
if p.next == None: # 看当前是否已经是最后一位
p.next = ListNode() # 开辟新的L3节点
temp,p.val = divmod(p.val,10) #
p.next.val += temp # 将商加到下一位
temp = 0 # 每次运算完成都重置商为0
p = p.next
if p == None:
return l # 遍历完成,返回
elif l1 != None and l2 != None:
l3.val = l1.val + l2.val
l1 = l1.next
l2 = l2.next
if l1 == None and l2 == None:
continue
else:
l3.next = ListNode()
l3 = l3.next
elif l1 == None and l2 != None:
l3.val = l2.val
l2 = l2.next
if l2 != None:
l3.next = ListNode()
l3 = l3.next
elif l1 != None and l2 == None:
l3.val = l1.val
l1 = l1.next
if l1 != None:
l3.next = ListNode()
l3 = l3.next