LeetCode第2题:两数相加
Ps:本系列文章只为记录自己刷LeetCode过程中的解题过程和思路。
题目描述:
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题过程和思路:
这道题的题目很明确,按照我们手算的思路来:从低位到高位依次相加,并且有进位就向高位进位即可。其实就是用链表来存储数字,并且用计算机模拟手算的过程罢了。但是这题以我目前的能力,不太理解要怎么操作才能加快算法的效率(不能打败90%以上的人),留待以后补充。
解题收获:
记得链表最初在C++中接触过,其他语言中暂时没有接触过链表。这题让我重复复习了一遍链表,并且熟悉了在python中建立和使用链表的方法,记住啦。
代码展示:
# 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
"""
result_head = p = ListNode(None) # result_head为结果链表的头结点(空的,返回的时候要返回 # result.next),p为用来遍历的指针
s = 0 # 初始进位为0
while l1 or l2 or s: # 如果l1非空或l2非空或有上一次计算有进位s非0
s = s + (l1.val if l1 else 0) + (l2.val if l2 else 0)
val = s % 10 # eg. 21 % 10 = 1
s = s // 10 # eg. 21 // 10 = 2
p.next = ListNode(val) # 以val值新建一个结点
p = p.next # 结果链表的遍历指针往下一位移
l1 = l1.next if l1 else None # 加数链表的指针对应往下一位移
l2 = l2.next if l2 else None # 加数链表的指针对应往下一位移
return result_head.next # 头结点为空结点,因此返回头结点的下一个结点
结果展示: