/*
* @lc app=leetcode.cn id=2 lang=cpp
*
* [2] 两数相加
*/
// @lc code=start
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
/*
建立新链表,头节点与移动节点以及临时节点
经过一系列运算,得到临时节点的数字信息
将临时节点挂在移动节点后面
为了解决长短问题,需要对长链表单独考虑,后续操作
注意进位,可能会导致一个新的节点的产生
*/
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* root = new ListNode(-1); // 最终结果
ListNode* node = nullptr; // 新建节点
ListNode* temp = root; // 移动头
int cur_val = 0; // 链表上的数字
int left = 0; // 进位
while (l1 && l2) {
// 当前位置上的数等于和进位的数
cur_val = (l1->val + l2->val + left) % 10;
// 更新进位数
left = (l1->val + l2->val + left) / 10;
// 创建一个新节点
node = new ListNode(cur_val);
temp->next = node;
temp = temp->next;
// 往后走
l1 = l1->next;
l2 = l2->next;
}
// l1是长链表
while (l1) {
cur_val = (l1->val + left) % 10;
left = (l1->val + left) / 10;
node = new ListNode(cur_val);
temp->next = node;
temp = temp->next;
l1 = l1->next;
}
// l2是长链表
while (l2) {
cur_val = (l2->val + left) % 10;
left = (l2->val + left) / 10;
node = new ListNode(cur_val);
temp->next = node;
temp = temp->next;
l2 = l2->next;
}
// 一定不要忘记进位可能会产生新的节点
if (left) {
node = new ListNode(left);
temp->next = node;
temp = temp->next;
}
return root->next;
}
};
// @lc code=end
leetcode 2.两数相加
最新推荐文章于 2024-07-23 16:17:06 发布