链表
更多请查看我的专栏:LeetCode(力扣)刷题指南
可直接在
LeetCode
中搜索题目名称
文章目录
1. 两数相加:链表
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
1.1 解决方案
算法思路:时间复杂度O(max(len(l1),len(l2)))即O(n)
# 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:
dummyNode=ListNode(0) #值不重要
l3=dummyNode
carry=0 #进阶初始化,carry=0或1
while(l1 or l2):
x=l1.val if l1 else 0 #如果l1的值为真,返回给x;否则x=0({},[],null,False,()这些数据都为假)
y=l2.val if l2 else 0 #为什么不是if l1.val或l2.val:如果是[1,8],[0]就会出错,l2的第二个结点根本不存在,无法判断
sum_l1l2=x+y+carry
carry=sum_l1l2//10
l3.next=ListNode(sum_l1l2%10) #这两行代码可以使用divmod()
l3=l3.next
if(l1 != None):l1=l1.next #不能判断l1.next!=None,否则l1.next永远不等于0,进入死循环
if(l2 != None):l2=l2.next
if(carry==1):
l3.next