思路:标记是否产生进位,并且两个链表均遍历完之后,要考虑进位是否是1,若为1则仍需要新建一个节点才存储进位的信息
Python3
# 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:
p1 = l1
p2 = l2
if not p1:
return p2
if not p2:
return p1
key = 0 # key表示是否进位
Head = ListNode((p1.val + p2.val) % 10)
key = int((p1.val + p2.val) / 10)
p1 = p1.next
p2 = p2.next
p = Head
while p1 and p2:
mid = ListNode((p1.val + p2.val + key) % 10)
key = int((p1.val + p2.val + key) / 10)
p.next = mid
p = mid
p1 = p1.next
p2 = p2.next
while p1:
mid = ListNode((p1.val + key) % 10)
key = int((p1.val + key) / 10)
p.next = mid
p = mid
p1 = p1.next
while p2:
mid = ListNode((p2.val + key) % 10)
key = int((p2.val + key) / 10)
p.next = mid
p = mid
p2 = p2.next
if key > 0: # 若最终有进位
mid = ListNode(key)
key = 0
p.next = mid
p = mid
return Head
精简写法:(创建一个带头的节点)
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
节省空间的写法: