思路
- 因为整数是按照逆序存放在链表中,所以直接从头结点就可以开始相加
- 老规矩,加上输入值判断
- 两个数相加有可能产生
进位
, 所以下一个结点相加时需要考虑进位的1 - 当一个数加完,另外一个还有节点, 只加这一个结点
- 当最后两个结点都加完,但是进位还在
考虑完毕
编写
按照上面的思路,按照正常逻辑写出如下代码
# 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:
# 进行输入值判断
if(l1 == None or l2 == None):
return None
sum = l1.val + l2.val #两个数相加的和
resultList = ListNode(sum%10) #初始化结果链表
p = resultList #中间指针
while(l1.next != None and l2.next != None):
l1 = l1.next
l2 = l2.next
sum = l1.val + l2.val + sum//10
temp = ListNode(sum%10)
p.next = temp
p = p.next
# 当l1不为空
while(l1.next != None):
l1 = l1.next
sum = l1.val + sum//10
temp = ListNode(sum%10)
p.next = temp
p = p.next
# 当l2不为空
while(l2.next != None):
l2 = l2.next
sum = l2.val + sum//10
temp = ListNode(sum%10)
p.next = temp
p = p.next
#还有进位时
if(sum//10 == 1):
temp = ListNode(1)
p.next = temp
p = p.next
return resultList
思考与学习
- 看了大神的代码, 发现自己的3个while循环,虽然逻辑很清楚,但是看着就很多,可以合并为一个
- 怎么合并呢,发现三个while的判断都是链表是不是为空,可以这里下手
- 于是得到下面的代码,代码明显减少,运行也快了一点
- 代码带可以继续改进,
两个if和两个赋值0可以合并一下
# 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:
# 进行输入值判断
if(l1 == None or l2 == None):
return None
sum = l1.val + l2.val #两个数相加的和
resultList = ListNode(sum%10) #初始化结果链表
p = resultList #移动指针
while(l1.next != None or l2.next != None):
l1.val = 0
l2.val = 0
l1 = l1 if(l1.next==None) else l1.next
l2 = l2 if(l2.next==None) else l2.next
sum = l1.val + l2.val + sum//10
temp = ListNode(sum%10)
p.next = temp
p = p.next
#还有进位时
if(sum//10 == 1):
temp = ListNode(1)
p.next = temp
p = p.next
return resultList