【LeetCode】2,两数相加。 难度等级:中等。


【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 中常用。

猜你喜欢

转载自blog.csdn.net/qq_43799400/article/details/130828380