大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目考察的是链表的操作、数学运算以及模拟加法操作。
题目解答方法的文字分析
我们可以使用模拟的方法进行链表的相加操作。从链表的头节点开始,逐个节点相加,同时考虑进位情况。
具体步骤如下:
- 初始化一个新链表的头节点
dummy
,以及一个指向新链表当前节点的指针cur
,初始时两者都指向nullptr
。 - 初始化进位变量
carry
为 0,用于处理相加过程中的进位情况。 - 使用一个循环遍历两个链表,直到两个链表都为空为止。在循环中,分别获取当前两个链表节点的值,如果一个链表已经为空,那么对应的值取 0。
- 计算当前节点的值:将两个链表节点的值以及进位相加,得到的和再加上进位,然后取余得到当前节点的值。
- 计算新的进位:将两个链表节点的值以及进位相加,得到的和再除以 10,得到的商即为新的进位。
- 创建一个新的节点,将计算得到的值赋给这个节点,然后将这个节点连接到新链表的末尾。
- 将指针
cur
移动到新链表的最后一个节点,以便下一次连接新的节点。 - 循环结束后,如果最后的进位不为 0,还需要创建一个节点,将进位的值赋给这个节点,并连接到新链表的末尾。
- 返回新链表的头节点
dummy->next
,即为结果链表。
本题解析所用的编程语言
C++
完整且正确的编程代码
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: ListNode* addEnergyValues(ListNode* l1, ListNode* l2) { ListNode* dummy = new ListNode(-1); // 创建一个虚拟头节点 ListNode* cur = dummy; // 当前节点指针 int carry = 0; // 进位 // 遍历链表并模拟相加 while (l1 || l2 || carry) { int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry; // 当前节点的和 carry = sum / 10; // 更新进位 cur->next = new ListNode(sum % 10); // 创建新节点并连接到新链表 cur = cur->next; // 移动当前节点指针 // 移动两个链表指针 if (l1) l1 = l1->next; if (l2) l2 = l2->next; } return dummy->next; // 返回新链表的头节点 } };
这个代码使用模拟的方法来实现链表的相加操作。通过遍历两个链表,模拟相加过程,并在过程中创建新的节点。在最后还要处理可能的进位情况。