返回

巧破链表求和,算法入门好帮手!

后端

前言:LeetCode 题库初识

算法工程师是当下热门职业,LeetCode 是国际知名的算法练习网站,拥有海量优质的算法题库,是算法工程师面试必备武器。题库中题目难易程度不一,从简单到极难,涵盖不同算法知识点。

「链表求和」:算法入门好帮手

「链表求和」是 LeetCode 上的一道中级难度面试题,考察的是链表的遍历和模拟加法两种基本算法。题目如下:

给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位数在链表的最右边。对此,你应当从最右边开始遍历这两个链表,逐位相加并用链表形式返回结果。

算法剖析:逐位求和与链表拼接

针对这道题目,我们可以使用朴素的逐位求和算法和链表拼接的方法来解决。下面分步介绍算法流程:

  1. 链表遍历和数据提取:

    • 将两个链表的头指针分别指向两个待求和链表的首个节点。
    • 逐个比较当前节点的数值,相加得到新的数值。
    • 若相加结果大于或等于 10,则需要进位,并将进位值记录下来。
  2. 链表拼接:

    • 根据上一步得到的数值和进位值,创建一个新的节点,将该节点链接到结果链表的末尾。
    • 遍历至两个链表的末尾,将剩余的节点逐个链接到结果链表。
  3. 处理进位情况:

    • 若在遍历过程中遇到进位值不为 0 的情况,则需要在结果链表的末尾创建一个新的节点,并将进位值作为该节点的数值。

代码实现:

def addTwoNumbers(l1, l2):
  # 初始化结果链表的头指针
  dummy = ListNode(0)
  # 指向结果链表的当前节点
  current = dummy
  # 进位值
  carry = 0
  
  # 循环遍历两个链表
  while l1 or l2 or carry:
    # 相加得到新的数值
    val = carry
    if l1:
      val += l1.val
      l1 = l1.next
    if l2:
      val += l2.val
      l2 = l2.next
    
    # 更新进位值
    carry = val // 10
    
    # 创建新的节点,并链接到结果链表
    current.next = ListNode(val % 10)
    current = current.next
  
  # 返回结果链表的头指针
  return dummy.next

结语:算法学习贵在实践

「链表求和」是算法学习旅程中的一个重要里程碑,掌握这一算法不仅可以为你打开 LeetCode 等算法题库的大门,也是日后学习更复杂算法的基础。希望这篇指南能帮助你更好地理解这道题,也鼓励你继续探索算法世界的奥秘。