精选算法宝典50题——1 两数相加
今天给大家带来精选算法宝典50题的第一题:两数相加
关键字:链表;模拟
题目描述:
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
示例2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:输出:[8,9,9,9,0,0,0,1]
Python题解
思路与算法
根据示例可知,输入两个链表是逆序保存,因此可以从前往后逐位进行相加并保存进位来模拟两数相加:
-
同时遍历两个链表l1,l2,逐位计算它们与进位的和将个位保存在l1中,十位则更新进位carry;
-
l1遍历完之后,需要在尾部添加新的节点以继续保存两数之和;
-
l1和l2都遍历完的最后,若进位大于0,则还需要在尾部添加新节点以保存进位。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def addTwoNumbers(self, l1, l2): # 模拟两数相加过程,并将结果保存在l1
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
l1head = l1 # l1head保存l1的头地址
l1tail = l1
carry = 0 # carry, num1, num2 分别保存进位,l1对应位数字,l2对应位数字
num1 = 0
num2 = 0
while l1 or l2: # 若l1或l2还未到达链表尾部,则继续
if l1 is None: # 若l1已到达尾部,则l1的对应位数字num1为0,且添加一个值为0的节点
num1 = 0
l1 = l1tail.next = ListNode(0)
else:
num1 = l1.val # 否则为对应位数值
if l2 is None: # 若l2已到达尾部,则l2的对应位数字num2为0
num2 = 0
else:
num2 = l2.val # 否则为对应位数值
l1.val = (num1 + num2 + carry)%10 # l1保存两数相加在该位的结果
carry = (num1 + num2 + carry)/10
if l1 is not None: # 还存在下一位时,继续下一个节点
l1tail = l1
l1 = l1.next
if l2 is not None:
l2 = l2.next
if carry > 0: # 若最后还存在进位,则加一位进位
l1tail.next = ListNode(carry)
return l1head # 返回l1头结点
欢迎关注我的公众号:洋芋智能,里面将会定时分享计算机与人工智能领域的学习与就业干货