返回

解谜 445:两数相加 II,点燃你的算法之魂!

前端

在浩瀚的数据结构世界中,链表是一种古老而常见的形式。它将数据元素连接成一个线性序列,每个元素都包含指向下一个元素的指针。在本题中,我们将使用两个链表来表示两个非负整数。每个数字的最高位位于链表的头部,依次类推。

当我们把这两个链表相加时,我们需要从链表的头部开始逐位相加,并将结果保存在一个新的链表中。需要注意的是,如果相加的结果大于 9,则需要将进位记入下一位的相加中。

为了更好地理解算法的步骤,让我们举个例子。假设我们有两个链表:

链表 1:7 -> 2 -> 4 -> 3
链表 2:5 -> 6 -> 4

相加后,得到的新链表为:

新链表:2 -> 9 -> 8 -> 3

其中,2 是链表 1 的最高位数字 7 和链表 2 的最高位数字 5 相加后的结果。9 是链表 1 的次高位数字 2 和链表 2 的次高位数字 6 相加,并加上链表 1 的最高位相加后的进位 1 的结果。以此类推,依次相加即可得到最终的新链表。

那么,如何将这种算法思想转化为代码呢?我们使用 C++ 语言来实现:

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* dummy = new ListNode(0);
        ListNode* curr = dummy;
        int carry = 0;
        while (l1 || l2 || carry) {
            int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
            carry = sum / 10;
            curr->next = new ListNode(sum % 10);
            curr = curr->next;
            l1 = l1 ? l1->next : l1;
            l2 = l2 ? l2->next : l2;
        }
        return dummy->next;
    }
};

在代码中,我们使用了一个虚拟头结点 dummy 来作为新链表的起点,并通过 curr 指针来遍历这个新链表。在每次循环中,我们计算 l1、l2 和 carry 的和,并根据和的大小来更新 carry 和新链表的节点值。直到 l1、l2 和 carry 都为 0 时,循环才会结束。最后,我们返回 dummy->next,它指向新链表的第一个实际节点,即算法的最终结果。

两数相加 II 是算法竞赛和程序员面试中的常见题目,它不仅考察了算法的基本概念,还锻炼了链表操作的技巧。通过本文的详细讲解,相信你已经对这道题目的解决方法有了透彻的理解。下次再遇到类似的题目,你就可以胸有成竹,算法之魂熊熊燃烧,轻松取胜!