1.题目描述(中等难度)
2.解法1(模拟整数加法)
思路:由于两个链表存储数字的方式是相同的。
我们只需在遍历两个链表的同时将链表对应位置结点存储的数值直接相加即可。
在相加的过程中有可能产生进位,需要设置一个变量carry处理进位的情况。
图示:![在这里插入图片描述](https://img-blog.csdnimg.cn/20210524180440351.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTk1OTIyMA==,size_16,color_FFFFFF,t_70)
代码:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode * head = nullptr;
ListNode * tail = nullptr;
int carry = 0;
while(l1 || l2){
int n1 = l1?l1->val:0;
int n2 = l2?l2->val:0;
int sum = n1 + n2 + carry;
if(!head)head = tail = new ListNode(sum % 10);
else{
tail->next = new ListNode(sum %10);
tail = tail->next;
}
carry = sum / 10;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
if(carry) tail->next = new ListNode(carry);
return head;
};
};
时间复杂度:O(max(m,n)),m 和 n 代表 l1 和 l2 的长度。
空间复杂度:O(max(m,n)),m 和 n 代表 l1 和 l2 的长度。而其实新的 List 最大长度是 O(max(m,n))+ 1,因为我们的 head 没有存储值所以忽略不计了。