给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
class Solution(object):
def setListValue(self, vals):
# 赋值方法,将列表转换成带头结点的链表
link = ListNode(None)
p = link
for val in vals:
p.next = ListNode(int(val))
p = p.next
return link
def flipList(self, l):
# 头插法完成倒序,也可以用栈来实现
link, p = ListNode(None), None
link.next = p
q = l.next
while q.next is not None:
l = q.next
q.next = p
link.next = q
p = q
q = l
else:
q.next = link.next
link.next = q
return link
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
l1, l2= self.setListValue(l1), self.setListValue(l2)
# 反转链表
l1, l2 = self.flipList(l1), self.flipList(l2)
link = ListNode(None)
p, q, l = l1, l2, link
carry = 0 # 存储进位
while (p.next is not None) and (q.next is not None):
val = p.next.val + q.next.val + carry
carry = int(val / 10)
l.next = ListNode(val % 10)
p, q, l = p.next, q.next, l.next
# 两数长度不等
while p.next is not None:
val = p.next.val + carry
carry = int(val / 10)
l.next = ListNode(val % 10)
p, l = p.next, l.next
while q.next is not None:
val = q.next.val + carry
carry = int(val / 10)
l.next = ListNode(val % 10)
q, l = q.next, l.next
if carry != 0:
# 进位存在
l.next = ListNode(carry)
link = self.flipList(link)
res = []
while link.next is not None:
res.append(link.next.val)
link = link.next
print(res)
return res
if __name__ == '__main__':
s = Solution()
s.addTwoNumbers([7, 2, 4, 3], [5, 6, 4])
s.addTwoNumbers([9, 9, 5, 4, 3], [5, 6, 4])
运行结果:
注意点:
一定要考虑到结束之后进位变量里是否还存在进位,高位输出进位。