给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:创建一个新的链表,将对应位置的节点的值域进行求和(取余),要考虑到进位(整除部分)
from typing import List
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val # 值域
self.next = next # 指向下一个节点的指针
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
dst = cur = ListNode() # 初始化一个dst目标链表。cur临时链表,用于指向目标链表的尾部。
carry = 0 # 进位数
while l1 or l2:
sum = (l1.val if l1 else 0) + (l2.val if l2 else 0) + carry # 链表对应节点相加,进位也要考虑到,当任意一个链表遍历完后,补0
if sum >= 10: # 当和大于等于10时,更新进位数和sum
carry = int(sum / 10) # 10的整数部分
sum = sum % 10 # 10的余数部分
else:
carry = 0 # 和小于10时,进位数为0
cur.next = ListNode(sum) # 定义节点并赋值,临时链表的指针指向新节点
cur = cur.next # 更新临时链表的表头,即将临时节点指针指向目标节点的尾部
# 表头指向下一个节点
if l1: l1 = l1.next
if l2: l2 = l2.next
if carry != 0: # 当完成链表遍历后,进位数不为0时,新建节点放到目标链表的尾部
cur.next = ListNode(carry)
return dst.next
'''
创建链表
思路:
首先:初始化一个目标链表,并将链表赋值给临时链表;
接着:遍历列表,新建节点,存储数值;
然后:将节点赋值给临时链表的下一个节点;
最后:更新临时链表的指针,指向目标链表的尾部.
依次类推,完成列表的创建
'''
def createList(self, nums: List[int]):
dst = cur = ListNode() # 初始化dst节点,作为目标链表,cur用来记录目标链表的尾部节点指针
for i in nums:
cur.next = ListNode(i) # 将节点存到cur链表的尾部
cur = cur.next # 更新为最新的尾部节点指针
return dst.next
if __name__ == '__main__':
aa = [9, 9, 9, 9]
bb = [5, 6, 4]
myfun = Solution()
list1 = myfun.createList(aa)
list2 = myfun.createList(bb)
result = myfun.addTwoNumbers(list1, list2)
print("hello")