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