'''
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
'''
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
p = l3 = ListNode(0)
while l1 and l2:
p.val += l1.val + l2.val
p.next = ListNode(p.val // 10)
p.val %= 10
p, l1, l2 = p.next, l1.next, l2.next
r = l1 if l1 else l2 #剩余的链表
while r:
p.val += r.val
p.next = ListNode(p.val // 10)
p.val %= 10
p, r = p.next, r.next
if p.val == 0: #消除高位多余0
q = l3
while q.next != p:
q = q.next
q.next = None
return l3
def addTwoNumbers2(self, l1: ListNode, l2: ListNode) -> ListNode:
p = l3 = ListNode(0)
c = 0
while l1 and l2:
c += l1.val + l2.val
p.next = ListNode(c % 10)
c //= 10
p, l1, l2 = p.next, l1.next, l2.next
r = l1 if l1 else l2 #剩余的链表
while r:
c += r.val
p.next = ListNode(c % 10)
c //= 10
p, r= p.next, r.next
if c != 0: #增加最高位进位
p.next = ListNode(c)
return l3.next
#效率提高的原因是用减法运算代替求余数,而且不用遍历链表来消除高位多余0
def addTwoNumbers3(self, l1: ListNode, l2: ListNode) -> ListNode:
p = l3 = ListNode(0)
c = 0
while l1 and l2:
c += l1.val + l2.val
if c > 9:
p.next = ListNode(c - 10)
c = 1
else:
p.next = ListNode(c)
c = 0
p, l1, l2 = p.next, l1.next, l2.next
r = l1 if l1 else l2 #剩余的链表
while r:
c += r.val
if c > 9:
p.next = ListNode(c - 10)
c = 1
else:
p.next = ListNode(c)
c = 0
p, r= p.next, r.next
if c != 0: #增加最高位进位
p.next = ListNode(c)
return l3.next
a = [2, 4, 3]
b = [5, 6, 4]
p = l1 = ListNode(0)
for x in a:
p.next = ListNode(x)
p = p.next
p = l2 = ListNode(0)
for x in b:
p.next = ListNode(x)
p = p.next
x = Solution()
p = x.addTwoNumbers2(l1.next, l2.next)
while p:
print(p.val)
p = p.next