目录
题目
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字0之外,这两个数都不会以0开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
解题思路
设:
- X为输入参数1数据链表中的一个节点数据
- Y为输入参数2数据链表中的一个节点数据
- Sum为结果生成链表的一个节点数据。
Carry = (X + Y) / 10
Sum = X + Y + Carry
算法推演:
实现代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* headPtr = new ListNode();
ListNode* tailPtr = headPtr;
int carry = 0;
while(l1 || l2) {
int x = (l1 == nullptr ? 0 : l1->val);
int y = (l2 == nullptr ? 0 : l2->val);
int sum = x + y + carry;
carry = sum / 10;
tailPtr->next = new ListNode(sum % 10);
tailPtr = tailPtr->next;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
if(carry > 0) tailPtr->next = new ListNode(carry);
return headPtr->next;
}
};
复杂度分析
时间复杂度: O(max(m, n)), 其中m,n为两个链表的长度。我们要遍历两个链表的全部内容,而处理每个位置只需要O(1)的时间。
空间复杂度: O(max(m, n))。结果链表的长度最多为输入参数较长链表的长度+1。