题目
给定两个非空的链表,每个链表表示的是一个逆序的数字。求两个数字之和,以相同形式返回一个链表。

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
原题链接: https://leetcode-cn.com/problems/add-two-numbers/
思路
同步遍历两个链表,按位累加即可。需要注意的是,两个个位数相加有可能产生进位,所以需要考虑进位的情况。
所以每次遍历的时候,假设当前位置两个数分别为 n1,n2,进位数为 carry。则当前位的和为 (n1+n2+carry),则当前位的结果为和除10取余数 (n1+n2+carry)%10,新的进位数为和除10取商(n1+n2+carry)/10。
- 复杂度分析
- 时间复杂度 O(max(m, n))。m、n 表示两个链表的长度。遍历一次即可。
- 空间复杂度 O(1)。如果认为返回的链表结果的内存开销也计算在内,则是O(max(m, n))。
代码
/**
* 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* head = new ListNode();
ListNode* pre = head;
int carry = 0;
while(l1 || l2 || carry) {
int val1 = l1 ? l1->val : 0;
int val2 = l2 ? l2->val : 0;
int sum = val1 + val2 + carry;
ListNode* cur = new ListNode(sum % 10);
carry = sum / 10;
pre->next = cur;
pre = cur;
if (l1) {
l1 = l1->next;
}
if (l2) {
l2 = l2->next;
}
}
return head->next;
}
};
本文介绍如何通过同步遍历和进位处理,解决LeetCode题目中给定逆序链表的数字求和问题。讲解了算法思路、复杂度分析,并提供了C++代码实现。

837

被折叠的 条评论
为什么被折叠?



