【LeetCode】2,两数相加。 难度等级:中等。
一、题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例1:
示例2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例3:
输入:l1 = [0], l2 = [0]
输出:[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: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
head=ListNode(0,None)
tail=head
quotient=0 # 初始化需要进位的商
while l1 != None or l2 != None:
# 将较短的链表用 0 填充
if l1 == None:
l1=ListNode(0,None)
if l2 == None:
l2=ListNode(0,None)
mod = (l1.val+l2.val+quotient) % 10 # 余数
quotient = (l1.val+l2.val+quotient) // 10 # 商
tail.next = ListNode(mod,None)
# 链表向后位移
tail=tail.next
l1=l1.next
l2=l2.next
# 判断求和链表是否需要扩充一位长度
if quotient > 0:
tail.next=ListNode(quotient,None)
return head.next
执行结果:
执行用时:64 ms, 在所有 Python3 提交中击败了 39.91% 的用户
内存消耗:16.2 MB, 在所有 Python3 提交中击败了 5.12% 的用户
三、知识点
1、较短的链表可以用 0 填充,这样就可以同时遍历 l1 和 l2 两个链表。
2、要熟练使用 head 结点和 tail 结点的 “双指针” 组合,这种思想在链表问题中非常常见,可以参考 【LeetCode】203,移除链表元素。 难度等级:简单。链表入门题目,值得深入研究。
3、求商和余数,以及进位操作在 leetcode 中常用。