题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
链表
python 标准库并没有实现链表,所以我们得对链表这个了解. 可参考这里
解决方案
class Solution:
@staticmethod
def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
#进位
flag = 0
#头节点
head=ListNode(0)
#循环开始之前,上一个节点就是头节点
pre_node = head
#当前Node
current_node=None
# 当l1或l2位None的时候停止
while (l1 or l2):
# 如果 l1 不为空,则x 为l1 Node 的值
x = l1.val if l1 is not None else 0
# 如果 l2 不为空, 则 y 为 l2 Node 的值,否则就是 0
y = l2.val if l2 is not None else 0
#
raw_add = x + y + flag
# 取模得到相加后的node 的值
add = raw_add % 10
# 取整获取进位(python3 取整是 //)
flag = raw_add // 10
#当前node
current_node = ListNode(add)
#前一个node 的next 是 current_node
pre_node.next = current_node
#当前 node 为下次计算的 pre_node
pre_node = current_node
#下个循环开始
if (l1 is not None): l1 = l1.next
if (l2 is not None): l2 = l2.next
#循环结束,如果进位还有值,则当前节点的 next 就是进位
if (flag > 0):
current_node.next = ListNode(flag)
#从头节点开始,返回head 节点的next
return head.next
思路
- 新建头节点(head),上一个节点站(pre_node),当前node(current_node),进位flag
- 遍历节点l1,l2,两个节点的值加上进位,就是当前节点(current_node)的值。
- 遍历开始之前 pre_node 就是头节点(head)。pre_node 的next 应该是 current_node。下个循环开始之前 pre_node应该为当前节点(current_node)
- 每次循环更新进位flag 、 上一个节点 pre_node l1 和 l2
- 当循环结束,如果进位(flag)大于 0 时,则当前节点(current_node)的next 是ListNode(0)
- 返回head.next 就是我们需要的结果
总结
这个算法主要考对链表的熟悉程度。及对链表数据结构的理解,只要理解了链表,做起来还是比较简单的。
网友评论