题目
:::info
https://leetcode-cn.com/problems/add-two-numbers/
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。**示例 1:
:::
题解
其实很简单一道题,但是由于我对Python链表的语法非常不熟悉,结果就踩了无数坑。
官方给出的 ListNode 格式是这样的:
class ListNode(object):def __init__(self, val=0, next=None):self.val = valself.next = next
我就很天真地以为ListNote就是一个增强了的 list,于是自己咔哧咔哧写了一个实现。
然后一跑测试样例都对,开开心心一提交一堆错误。。。
# 这个在本地能跑通,并且是对的class ListNode(list):def __init__(self, L):self.idx = 0self.len = len(L)super(ListNode, self).__init__(L)def __getattr__(self, attr):if attr == 'val':if self.idx >= self.len:return Noneelse:return self[self.idx]elif attr == 'next':self.idx += 1if self.idx >= self.len:return Noneelse:return self[self.idx]def addTwoNumbers(l1, l2):""":type l1: ListNode:type l2: ListNode:rtype: ListNode"""L = []f = 0Flag = Truewhile Flag:a = l1.valif a == None:a = 0b = l2.valif b == None:b = 0c = (a+b+f) % 10f = (a+b+f)//10L.append(c)l1.nextl2.nextif not (l1.val or l2.val):Flag = Falseif f > 0:Flag = Truereturn Ll1 = ListNode([2,4,3])l2 = ListNode([5,6,4])print(addTwoNumbers(l1, l2)) #[7, 0, 8]
后来修改了无数次,终于提交过了
# Definition for singly-linked list.# class ListNode(object):# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution(object):def addTwoNumbers(self, l1, l2):""":type l1: ListNode:type l2: ListNode:rtype: ListNode"""dummy = L = ListNode(None)f = 0Flag = Truewhile Flag:if l1 == None:a = 0else:a=l1.vall1=l1.nextif l2 == None:b = 0else:b=l2.vall2=l2.nextc = (a+b+f) % 10f = (a+b+f)//10L.next=ListNode(c)L=L.nextif (l1 == None) and (l2 ==None):Flag = Falseif f > 0:Flag = Truereturn dummy.next
最后贴一个别人的代码 最直白的写法,还是得加油啊
class Solution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:# 创建一个结点值为 None 的头结点, dummy 和 p 指向头结点, dummy 用来最后返回, p 用来遍历dummy = p = ListNode(None)s = 0 # 初始化进位 s 为 0while l1 or l2 or s:# 如果 l1 或 l2 存在, 则取l1的值 + l2的值 + s(s初始为0, 如果下面有进位1, 下次加上)s += (l1.val if l1 else 0) + (l2.val if l2 else 0)p.next = ListNode(s % 10) # p.next 指向新链表, 用来创建一个新的链表p = p.next # p 向后遍历s //= 10 # 有进位情况则取模, eg. s = 18, 18 // 10 = 1l1 = l1.next if l1 else None # 如果l1存在, 则向后遍历, 否则为 Nonel2 = l2.next if l2 else None # 如果l2存在, 则向后遍历, 否则为 Nonereturn dummy.next # 返回 dummy 的下一个节点, 因为 dummy 指向的是空的头结点, 下一个节点才是新建链表的后序节点
