leetcode: 两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

这题是一道中等难度的题(可怜我这个彩笔前几天只敢做简单题),这题设计的一个关键就是链表

首先,链表中的两数相加应该是和加法一样各个位相加,而各个位相加的话就会有一个进位的问题,这题的关键就是处理这个进位的问题

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
re = ListNode(0) //初始化一个链表节点,作为头节点
r = re //作为建立链表的节点
carry = 0
while(l1 or l2):
x = l1.val if l1 else 0
y = l2.val if l2 else 0
s = carry + x + y
carry = s // 10
r.next = ListNode(s % 10)
r = r.next
if (l1 != None): l1 = l1.next
if (l2 != None): l2 = l2.next
if (carry > 0):
r.next = ListNode(1)
return re.next

其中有一个语法

1
x = l1.val if l1 else 0

意思同

1
2
3
4
if l1:
x = l1.val
else:
x = 0

实际上这个还有一个优化的空间,就是在发现了l1 或 l2为空的时候让 r 指向非空的链,节约算法空间与时间

上面的方法确实可行,在一条链结束的时候若有进位,而后面又全都是9,那就需要一个循环,这样可以提高一定的效率,下次二刷的时候再实现吧

LPL联手出现保送决赛= =,但是skt是最强的: - )