每日一题(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;}
};