题目表述
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表
方法:模拟
算法思想
- 创建一个虚拟表头,用于存储另外新的表头,将两个链表对应位置的数相加,放在虚拟表头的后面
- 使用一个指针去表达已经相加的位的节点,链表不为空,l1,l2分别指向l1->next,l2->next
- 需要注意两种情况:1.进位问题(两个三位数相加可能变成四位数) 2.某一个链表加着加着为空了
代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode();
ListNode* curr = dummy;
int carry = 0;
while (l1 || l2) {
int x = l1 ? l1->val : 0;
int y = l2 ? l2->val : 0;
int sum = x + y + carry;
curr->next = new ListNode(sum % 10);
curr = curr->next;
carry = sum / 10;
if (l1) l1 = l1->next;//如果l1不为空
if (l2) l2 = l2->next;//如果l2不为空
}
if (carry != 0) curr->next = new ListNode(carry);//carry不为零,向前进一位
return dummy->next;//返回新的表头
}
};
复杂度分析
时间复杂度:O(\max(m,n))O(max(m,n)),其中 mm 和 nn 分别为两个链表的长度。我们要遍历两个链表的全部位置,而处理每个位置只需要 O(1)O(1) 的时间。
空间复杂度:O(1)O(1)。返回值不计入空间复杂度。