返回

刷题日记(六):两数相加,强强联手赢未来!

后端




【刷题日记】2. 两数相加,强强联手赢未来!

大家好,欢迎来到我的刷题日记,我是你们的老朋友——刷题小达人。 今天,我们要一起挑战力扣网站上的一个中等难度题目:两数相加。

一、题目

看到题目,给人的第一印象就是简单。没错,这道题目的确不难,但它却蕴含着深刻的算法思想和数据结构知识。题目要求我们编写一个函数,将两个非负整数表示的链表相加,并返回和的链表。

二、解题思路

解决这道题目的关键在于理解链表的结构和操作。链表是一种线性数据结构,由一系列节点组成,每个节点包含一个数据值和指向下一个节点的指针。链表的优点在于它可以动态地调整大小,非常适合存储大量数据。

三、算法实现

有了链表的基本概念,我们就可以开始实现算法了。我们首先将两个链表的头部节点分别记为head1head2。然后,我们创建一个新的链表head来存储和的链表。接着,我们遍历head1head2这两个链表,将它们的节点值相加,并将结果存储在head链表中。如果相加的结果大于或等于10,我们就将进位值1记下,并在下一个节点的相加结果中加上1。最后,我们返回head链表作为结果。

四、代码示例

def addTwoNumbers(head1, head2):
  """
  :type head1: ListNode
  :type head2: ListNode
  :rtype: ListNode
  """
  dummy = ListNode(0)
  current = dummy
  carry = 0

  while head1 or head2 or carry:
    val1 = head1.val if head1 else 0
    val2 = head2.val if head2 else 0
    total = val1 + val2 + carry
    carry = total // 10
    current.next = ListNode(total % 10)

    current = current.next
    head1 = head1.next if head1 else None
    head2 = head2.next if head2 else None

  return dummy.next

五、复杂度分析

该算法的时间复杂度为O(max(m, n)),其中mn分别是两个链表的长度。空间复杂度为O(max(m, n)),因为我们需要创建一个新的链表来存储和的链表。

六、结语

两数相加是力扣网站上的一道经典题目,也是面试中经常被问到的题目。通过这道题目的讲解,希望大家能够对链表有更深入的理解,并掌握链表的常见操作。希望大家继续关注我的刷题日记,我们一起在刷题的海洋中乘风破浪,勇往直前!