每日一题(LeetCode)----链表–两数相加
1.题目(2. 两数相加)
-
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
- 每个链表中的节点数在范围
2.解题思路
思路一
循环
1.先获取两个链表的长度,然后把较长链表作为我们的结果链表 2.创建一个记录进位的变量,用两个指针从头开始遍历两个链表每次遍历到的节点如果非空,那么把当前节点中的值和当前进位进行相加,如果和大于10,那么下一次的进位变为1,然后和减10,存到结果链表的对应节点中,一直遍历直到遍历完较长链表时结束,(为了之后我们添加新节点,所以遍历到较长链表的结尾时,我们用tail指针保存一下较长链表的结尾) 3.然后我们查看当前进位是否为0,如果不为零,那我们新创建一个节点,接到结果链表的后面操作结束,如果为零,那么不需要新创建一个节点,操作结束 4.返回新链表的头节点
思路二:递归
递归解法非常巧妙。
做递归题目一定要牢记「递归函数的定义」。
递归函数定义:addTwoNumbers 表示将两个链表 l1 和 l2 相加得到的新链表; 递归终止条件:如果 l1 和 l2 有一个为空,则返回另外一个。 递归函数内容:
把两个链表节点的值相加(结果记为 add )。把 add 模 10 作为当前的链表节点的值。
把两个链表的 next 节点相加。(注意:如果当前相加的结果 add>=10,需要把 next 节点相加得到的结果 + 1。)
递归解法妙在天然地处理好了两个链表不一样长、最终相加结果有进位的情况。
原作者:负雪明烛
链接:https://leetcode.cn/problems/add-two-numbers/
自己的理解:就是先从前到后先走一遍,算出所有的和作为答案,然后从后往前看有哪个和超过了10,超过了10就继续向后递归,但是递归的对象变为当前进位和它的下一位和,到了递归的终止条件之后,就继续向前返回
3.写出代码
思路一的代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//先获取两个链表的长度
int length1=0;
int length2=0;
ListNode* Temp1=l1;
ListNode* Temp2=l2;
int length=0;
while(Temp1){
length1++;
Temp1=Temp1->next;
}
while(Temp2){
length2++;
Temp2=Temp2->next;
}
//判断那个链表长作为我们的结果链表
ListNode* res1=nullptr;
ListNode* res2=nullptr;
if(length1>=length2){
length=length1;
res1=l1;
res2=l2;
}
else{
length=length2;
res1=l2;
res2=l1;
}
Temp1=res1;
Temp2=res2;
int carry=0;//记录进位的变量
ListNode* Temp3=nullptr;//存的是较长链表的最后一个节点
//两个链表对应的节点进行相加
while(length--){
int sum=0;
if(Temp1&&Temp2){
sum=Temp1->val+Temp2->val+carry;
}
else{
sum=Temp1->val+carry;
}
carry=0;
if(sum>=10){
carry++;
sum=sum-10;
Temp1->val=sum;
}
else{
Temp1->val=sum;
}
if(Temp1->next==nullptr){
Temp3=Temp1;
}
Temp1=Temp1->next;
if(Temp2){
Temp2=Temp2->next;
}
}
if(carry>0){
ListNode* node=new ListNode(carry);
Temp3->next=node;
}
return res1;
}
};
思路二的代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (!l1) return l2;
if (!l2) return l1;
int target = l1->val + l2->val;
ListNode* res = new ListNode(target % 10);
res->next = addTwoNumbers(l1->next, l2->next);
if (target >= 10){
res->next = addTwoNumbers(res->next, new ListNode(1));
}
delete l1, l2;
return res;
}
};