题解 | #链表相加(二)#
链表相加(二)
https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b
题目:链表相加,并链表输出结果
思路;链表末尾对齐(长链表先走lenA-lenB步),确定较长链表,逐位相加存放数组中(按顺序各位次求和,正序存放)
为确定进位,先将数组逆序,逐步计算进位carry和当前数字,存放新List中
- 细节:初始carry=0,当前位的carry为val,计算下位carry = (number + val)/ 10, 余数 = (number + val)% 10
List从末尾逐位pop,建立新链表
python函数:
reversed(List)
数组索引不能是变量,插入新值用append()
# 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:
# write code here
# 保存各位数字
nums = []
# 链表对齐
len1 = 0
len2 = 0
head = head1
while head:
len1 += 1
head = head.next
head = head2
while head:
len2 += 1
head = head.next
# 确定较长链表
if len1 > len2:
curBig = head1
curShort = head2
else:
curBig = head2
curShort = head1
# 对齐头链表,并将更长部分计入数组
for i in range(0, abs(len1-len2)):
nums.append(curBig.val)
curBig = curBig.next
# 同步移动,同位相加
while curBig:
nums.append(curBig.val + curShort.val)
curBig = curBig.next
curShort = curShort.next
# 从数字生成数组,注意逆序生成
nums = list(reversed(nums))
carry = 0
carrynums = []
for i in range(0, len(nums)):
val = carry
carry = (nums[i] + val) // 10 # 每次能计算进位0 或 1
number = (nums[i]+ val) % 10
carrynums.append(number)
if carry == 1 :
carrynums.append(1)
#出栈生成链表
head = ListNode(0)
p = head
while len(carrynums) != 0:
q = ListNode(carrynums.pop())
p.next = q
p = q
return head.next