题目分析和实现
解法一
初步想法是先将链表还原成数字,然后数字相加,然后将数字转换成链表。
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
number_one=0
base_number_one=1# 基数
number_two=0
base_number_two=1
while l1!=None:
t=l1.val*base_number_one
base_number_one=base_number_one*10
number_one=number_one+t
l1=l1.next
while l2!=None:
t=l2.val*base_number_two
base_number_two=base_number_two*10
number_two=number_two+t
l2=l2.next
res_number=number_one+number_two
res_link=ListNode(0) # 初始化一个链表
if res_number==0:# 排除特殊的情况0
return res_link
result=res_link # result作为头指针
# res_link 作为链表指针,然后构造链表
while res_number!=0:
# 取数操作
t=res_number%10
res_number=res_number//10
# 更新链表指针
res_link.next=ListNode(t)
res_link=res_link.next
return result.next # 受语言特性的影响,开始的一个节点是哑元节点
解法二
很显然上述的方法效率不算高,因为我们完全可以在迭代l1和l2的时候完成数的相加,不需要来回转换。
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
res_link=ListNode(0)
result=res_link
carry=0
while l1 or l2 or carry:
t=0
if l1:
t=t+l1.val
l1=l1.next
if l2:
t=t+l2.val
l2=l2.next
if carry:
t=t+carry
carry=0
if t>=10:# 也可以使用carry, val = divmod(carry, 10)来取得整倍数和取模值
t=t-10
carry=1
res_link.next=ListNode(t)
res_link=res_link.next
return result.next