题目
给出两个非空链表表示两个非负整数,其中,它们各自的位数是按照逆序的方式存储的,并且它们的节点只能存储一个数字。
求,将两个数相加起来,返回一个新的链表来表示它们的和。
注,假设除了数字0之外,这两个数都不会以0开头
链表相关知识
- 链表,常见的数据结构,用指针将一连串的数据存储单元串接起来,每个单元可以划分为数据域+指针域,数据域用于存储数据,指针域用于指向其他单元,这样具有数据域+指针域的单元也叫做节点。
- 在链表中,第一个节点称为头节点,最后一个节点称为尾节点,尾节点处next引用为空,即没有下一个节点,每个节点的next都相当于指针,指向另一个节点,通过对next引用,可以从头节点向尾节点移动。
- 优点:在插入删除时不需要移动其他元素,只需要改变指针;各个节点在内存空间中不需要连续;
- 缺点:数组元素访问率低,数组存储空间连续,空间利用率低
程序
# Definition for singly-linked list. 单链表定义
# class ListNode:
# def __init__(self, x):
# self.val = x 数值域
# self.next = None 指针域
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
head=ListNode(0); #头节点,无存储
curr=head #初始化链表节点
carry=0 #初始化进一的值
while carry>0 or l1 or l2:
sum=carry
sum+=l1.val if l1 else 0 #l1不为空,则取l1.val的值,这样写可以节省代码空间
sum+=l2.val if l2 else 0
carry=sum//10 #地板除,求进一,即向下取整
curr.next=ListNode(sum%10) #取余数,求本节点
curr=curr.next #更新指针
if l1: #求空否,防止出现无后继节点
l1=l1.next
if l2:
l2=l2.next
return head.next