# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param head1 ListNode类 
# @param head2 ListNode类 
# @return ListNode类
#
class Solution:
    def addInList1(self , head1: ListNode, head2: ListNode) -> ListNode:
        # write code here
        arr1=[]
        cur1=head1
        arr2=[]
        cur2=head2
        while cur1:
            arr1.append(cur1.val)
            cur1=cur1.next
        while cur2:
          arr2.append(cur2.val)
          cur2=cur2.next
        arr1=arr1[::-1]
        arr2=arr2[::-1]
        #print(arr1,arr2)
        p =0 
        len1=len(arr1)
        len2=len(arr2)
        i =0 
        j=0 
        res=[]
        while i<len1 or j<len2:
            #print(res)
            if i<len1 and j<len2:
                temp=arr1[i] +arr2[j]+p 
                res.append(temp%10)
                p= temp//10
                i+=1
                j+=1
            elif i>=len1 and j<len2:
                temp=arr2[j]+p
                res.append(temp%10)
                p=temp//10
                j+=1
            elif i<len1 and j>=len2:
                temp=arr1[i]+p
                res.append(temp%10)
                p=temp//10
                i+=1
        if p>0:
            res.append(p)
        # 反转
        res=res[::-1]
        newhead=ListNode(0)
        cur =newhead
        for i in range(len(res)):
            cur.next=ListNode(res[i])
            cur=cur.next
        return newhead.next
              
    """
    解题思路:
    [9,3,7],[6,3] 
     0.定义链表反转
     1. 将两个链表反转 [7,3,9]  [3,6], 定义结果链表 res=ListNode(-1) 
     2. p1 指向第一个链表 ,p2 指向第二个链表 p 表示进位
     3 .外侧循环条件 p1 或者p2 不为空 
        情况1; p1 and p2 都不为空 p1.val +p2.val +p 
        情况2: p1不为空 ,p2 为空 p1.val+p 
        情况3: p1为空,p2不为空 p2.val+p 
	 4. 如果循环结束之后p 还有进位作为节点值加入res
     5.  res.next 传入reverselist(res.next) 反转 返回newres
	 6. 返回newres 头结点
     时间复杂度: O(max(m,n))  
	 空间复杂度 O(1)  定义头结点变量
    """
    def addInList(self , head1: ListNode, head2: ListNode) -> ListNode:
        # write code here
        def reverselist(head:ListNode)->ListNode:
            if not head or not head.next:
                return head 
            cur =head
            pre=None
            while cur:
                next=cur.next
                cur.next=pre  
                pre =cur 
                cur=next
            return pre 
        # 判断
        if not head1 and not head2:
            return head1 
        if head1 and  not head2:
            return head1
        if not head1 and    head2:
            return head2
        
        res=ListNode(-1)
        cur =res 
        newhead1=reverselist(head1)
        #print(newhead1.val)
        newhead2=reverselist(head2)
        #print(newhead2.val)
        cur1=newhead1
        cur2=newhead2
        p=0 # 进位
        while cur1 or cur2:
            if cur1 and cur2:
                #print(cur1.val,cur2.val)
                temp =cur1.val+cur2.val+p 
                cur.next=ListNode(temp%10)
                p=temp//10
                cur=cur.next 
                cur1=cur1.next 
                cur2=cur2.next
            elif not cur1 and cur2:
                temp=cur2.val+p
                cur.next=ListNode(temp%10)
                p=temp//10
                cur=cur.next
                cur2=cur2.next
            elif cur1 and not cur2:
                temp=cur1.val+p
                cur.next=ListNode(temp%10)
                p=temp//10
                cur=cur.next
                cur1=cur1.next
        # 最后如果p 不为空 
        if p:
            cur.next=ListNode(p)
        #反转res 
        newres =reverselist(res.next)
        return newres