返回

算法学习乐趣-让LeetCode成为你的数学演算场!

闲谈

算法魅力无穷,数学乐趣无限

算法是计算机科学的核心,也是数学与计算机科学的完美结合。算法学习不单单关乎技巧的掌握,更是逻辑思维能力的训练。LeetCode提供了一个理想的环境,让你在算法的海洋里驰骋,感受数字的魅力。

两数相加,算法开路

两数相加是LeetCode的一道经典题,看似简单,却蕴藏着丰富的算法思想。它要求你将两个非负整数表示为链表的形式,然后将这两个整数相加,得到一个新的链表来表示和。

算法步骤,逐一详解

  1. 链表表示数字 :首先,你需要把两个非负整数表示成链表的形式。具体做法是,创建一个哑结点(dummy node)作为链表的头结点,然后依次将两个整数的每一位数字作为链表的结点值,连接到哑结点的后面。

  2. 相加过程,逐位进位 :当两个链表表示的整数相加时,你需要从两个链表的尾结点开始,逐位相加。如果相加结果小于10,则直接作为链表的新结点值。如果相加结果大于或等于10,则将进位值1记下,并将相加结果减去10,作为链表的新结点值。

  3. 处理进位,确保准确 :在逐位相加的过程中,你需要时刻注意进位情况。如果在相加过程中产生进位,需要将进位值添加到下一个结点的相加结果中。

  4. 收尾工作,完美呈现 :当两个链表相加完成后,如果链表的最后一个结点的值不为0,则将该结点值作为链表的新结点值。如果链表的最后一个结点值为0,则将该结点删除。

代码实现,完美收官

def addTwoNumbers(l1, l2):
  # 创建一个哑结点作为链表的头结点
  dummy = ListNode(0)
  # 指针指向哑结点
  current = dummy
  # 进位值
  carry = 0

  # 遍历两个链表
  while l1 or l2 or carry:
    # 将链表结点值相加,并加上进位值
    val = (l1.val if l1 else 0) + (l2.val if l2 else 0) + carry
    # 将相加结果除以10,得到新的结点值
    current.next = ListNode(val % 10)
    # 将进位值更新为相加结果除以10的整数部分
    carry = val // 10
    # 指针移动到下一个结点
    current = current.next
    # 移动到下一个结点
    l1 = l1.next if l1 else None
    l2 = l2.next if l2 else None

  # 返回哑结点的下一个结点,即链表的头结点
  return dummy.next

总结提升,持续精进

算法学习是一个循序渐进的过程,两数相加只是其中一个小小的起点。想要成为一名算法高手,你需要不断地练习、不断地钻研。LeetCode是一个很好的平台,提供了丰富的算法题库,让你可以不断地挑战自我,提升自己的算法能力。

算法学习,乐趣无穷,数学演算,魅力无限。让我们携手LeetCode,共同踏上算法学习的奇妙之旅!