剑指 Offer II 025. 链表中的两数相加
创始人
2024-06-01 02:54:53

题目链接

剑指 Offer II 025. 链表中的两数相加 mid

题目描述

给定两个 非空链表 l1l2来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

可以假设除了数字 0之外,这两个数字都不会以零开头。

示例1:

在这里插入图片描述

输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]

示例2:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]

示例3:

输入:l1 = [0], l2 = [0]
输出:[0]

提示:

  • 链表的长度范围为 [1,100][1, 100][1,100]
  • 0<=node.val<=90 <= node.val <= 90<=node.val<=9
  • 输入数据保证链表代表的数字无前导 0

解法一:反正链表 模拟加法

如图,以下两个链表做加法 [7 , 2 , 4 , 3][5 , 6 , 4]

在这里插入图片描述

我们一般模拟加法都是 从最低位 开始相加,也就是需要把链表倒过来。

在这里插入图片描述

模拟加法。

在这里插入图片描述
最后再将结果链表反转过来,就是答案 [ 7 , 8 , 0 , 7]

在这里插入图片描述

链表如何反转

时间复杂度: O(n)O(n)O(n)

代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverse(ListNode* head){ListNode *cur = head , *pre = nullptr;while(cur != nullptr){ListNode* nextNode = cur->next;cur->next = pre;pre = cur;cur = nextNode;}return pre;}ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode *a = reverse(l1) , *b = reverse(l2);ListNode* dummy = new ListNode(-1);ListNode* pre = dummy;int ca = 0;while(a != nullptr || b != nullptr || ca){int sum = ca;if(a != nullptr){sum += a->val;a = a->next;}if(b != nullptr){sum += b->val;b = b->next;}ListNode *node = new ListNode(sum%10);pre->next = node;pre = node;ca = sum / 10;}return reverse(dummy->next);}
};

解法二:栈 模拟加法

又有题目要求 我们不能改变原链表的结构。所以,我们可以用两个 栈stack来分别存储两个链表的节点值,接着再来模拟加法。

时间复杂度: O(n)O(n)O(n)

代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverse(ListNode *head){ListNode *pre = nullptr;ListNode *cur = head;while(cur){ListNode *nextNode = cur->next;cur->next = pre;pre = cur;cur = nextNode;}return pre;}ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {stack a,b;while(l1 != nullptr){a.push(l1->val);l1 = l1->next;}while(l2 != nullptr){b.push(l2->val);l2 = l2->next;}ListNode *dummy = new ListNode(-1);ListNode *pre = dummy;int ca = 0;while(!a.empty() || !b.empty() || ca){int sum = ca;if(!a.empty()){sum += a.top();a.pop();}if(!b.empty()){sum += b.top();b.pop();}ListNode *node = new ListNode(sum % 10);pre->next = node;pre = node;ca = sum / 10;}return reverse(dummy->next);}
};

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...