题目链接
这道题考察单链表操作的入门题目。
这道题并不难,写这篇博文并不是因为我不会,主要是想强调一下代码编写的问题。
—— 我们不仅要能写出代码,还应该追求高质量的代码!
野生代码
请看我最原始的代码。
# 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:
a = ListNode((l1.val + l2.val) % 10)
p1,p2 = l1,l2
p = a
t = (l1.val + l2.val) // 10
p1 = p1.next
p2 = p2.next
while p1 != None and p2 != None:
t += p1.val + p2.val
p.next = ListNode(t % 10)
t //= 10
p = p.next
p1,p2 = p1.next,p2.next
while p1 != None:
t += p1.val
p.next = ListNode(t % 10)
t //= 10
p = p.next
p1 = p1.next
while p2 != None:
t += p2.val
p.next = ListNode(t % 10)
t //= 10
p = p.next
p2 = p2.next
while t != 0:
p.next = ListNode(t % 10)
t //= 10
return a
即不考虑代码的优化问题,完全按照最开始的思路来:
t
是用于进位的变量- 对于
l1
和l2
的位数上都有值时,从低位到高位做相加计算 - 对只有
l1
位数上有值的计算 - 对只有
l2
位数上有值的计算 - 对进位不为0的计算
高质量代码
# 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:
cur = dum = ListNode(-1)
t = 0
while l1 != None or l2 != None or t != 0:
if l1 != None:
t += l1.val
l1 = l1.next
if l2 != None:
t += l2.val
l2 = l2.next
cur.next = ListNode(t % 10)
cur = cur.next
t //= 10
return dum.next
原始代码中有多个while
语句,通过在一个while
语句中增加if
判断,可以巧妙地将四个while
合一。
实现代码的浓缩,避免代码冗长。
原创不易,感谢支持!