返回

刷出新体验:LeetCode二刷之旅——两数相加篇

前端

踏上二刷之旅:算法升华

LeetCode二刷,不仅是为了重复练习,更是为了在原有基础上深入探索算法精髓。二刷过程中,我们要做到:

  • 抽丝剥茧,透视本质: 透过表象,直击算法核心,深刻理解其设计思想。
  • 举一反三,触类旁通: 从一道题中总结通用解题思路,拓展到其他相关问题。
  • 优化解法,精益求精: 在已有基础上,不断优化代码,提升算法效率。

两数相加:链表的华尔兹

两数相加题目如下:

给你两个非空的链表,表示两个非负整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将这两个数相加,并以相同形式返回一个表示和的链表。

看似简单,却暗藏玄机。解题的关键在于对链表操作的熟练掌握以及对进位处理的巧妙考量。

解题舞步,优雅相加

我们按照题目要求,一步步拆解解题思路:

  • 定义结果链表: 用于存储最终的相加结果。
  • 定义进位: 初始化为0,用于记录相加过程中产生的进位。
  • 循环相加: 只要进位不为0或两个链表中仍有节点未处理,就继续循环。
  • 每次循环: 计算当前两个链表节点的值和进位之和,并取个位数作为结果。将计算出的结果添加到结果链表中。如果和大于等于10,则将进位记为1,否则进位为0。
  • 返回结果: 循环结束后,返回结果链表。

代码展示,算法之美

以下代码清晰展示了解题思路:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def addTwoNumbers(l1, l2):
    dummy = ListNode()
    curr = dummy
    carry = 0

    while l1 or l2 or carry:
        val1 = l1.val if l1 else 0
        val2 = l2.val if l2 else 0
        sum = val1 + val2 + carry
        carry = sum // 10
        curr.next = ListNode(sum % 10)
        curr = curr.next
        l1 = l1.next if l1 else None
        l2 = l2.next if l2 else None

    return dummy.next

总结提升,算法进阶

通过二刷两数相加,我们不仅巩固了链表操作的基础,还锻炼了进位处理的技巧。更重要的是,二刷让我们对算法的理解更加深入,能够从容应对更复杂的算法问题。

算法学习是一条漫漫征途,二刷只是其中一站。在未来的学习中,让我们继续保持求知若渴的精神,不断突破自我,在算法的世界中尽情驰骋!