链表相加(二)-牛客
思路
- 链表翻转:双指针+虚拟头结点
1、先把2个链表翻转,这样就变成个十百千
2、对两个链表相加
3、对相加后的链表再次翻转
时间复杂度O(max(m,n))
空间复杂度O(1)
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head1 ListNode类
# @param head2 ListNode类
# @return ListNode类
#
class Solution:
def addInList(self , head1: ListNode, head2: ListNode) -> ListNode:
# 链表翻转:先翻转两个链表,个十百千,加完后再次翻转
#任意一个为空,返回另一个
if head1==None:
return head2
if head2==None:
return head1
#翻转2个链表
head1=self.reverseList(head1)
head2=self.reverseList(head2)
#虚拟头结点
res=ListNode(-1)
head=res
#进位符号
carry=0
#只有某个链表不为空或进位还有值
while head1 != None or head2 != None or carry != 0:
val1 = 0 if head1 == None else head1.val
val2 = 0 if head2 == None else head2.val
#相加
tmp=val1+val2+carry
#获得进位
carry=tmp//10
#留在本位的值
tmp=tmp%10
#添加元素
head.next=ListNode(tmp)
head=head.next
#移动下一个
if head1:
head1=head1.next
if head2:
head2=head2.next
#结果再次翻转
return self.reverseList(res.next)
def reverseList(self,head):
if head==None:
return None
pre=None
cur=head
while cur:
tmp=cur.next
cur.next=pre
pre=cur
cur=tmp
return pre