题目链接
题目描述
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 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]
0 <= node.val <= 9
- 输入数据保证链表代表的数字无前导 0
进阶: 如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。
解题思路
方法一:反转链表
先将两个链表反转,然后结果用头插法
/**
* 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* addTwoNumbers(ListNode* l1, ListNode* l2) {
l1 = reverseHead(l1);
l2 = reverseHead(l2);
ListNode* hair = new ListNode();
int carry = 0;
while(l1||l2||carry){
int x = 0;
int y = 0;
if(l1){
x = l1->val;
l1 = l1->next;
}
if(l2){
y = l2->val;
l2 = l2->next;
}
int tmp = x+y+carry;
carry = tmp/10;
// 头插法
ListNode* cur = new ListNode(tmp%10);
cur->next = hair->next;
hair->next = cur;
}
return hair->next;
}
// 反转链表
ListNode* reverseHead(ListNode* head){
if(head==nullptr||head->next==nullptr){
return head;
}
ListNode* res = reverseHead(head->next);
head->next->next = head;
head->next = nullptr;
return res;
}
};
- 时间复杂度 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* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int> s1,s2;
while(l1){
s1.push(l1->val);
l1 = l1->next;
}
while(l2){
s2.push(l2->val);
l2 = l2->next;
}
ListNode* hair = new ListNode();
int carry = 0;
while(!s1.empty()||!s2.empty()||carry){
int x = 0;
int y = 0;
if(!s1.empty()){
x = s1.top();
s1.pop();
}
if(!s2.empty()){
y = s2.top();
s2.pop();
}
int tmp = x+y+carry;
carry = tmp/10;
// 头插法
ListNode* cur = new ListNode(tmp%10);
cur->next = hair->next;
hair->next = cur;
}
return hair->next;
}
};
时间复杂度 O(max(m,n))
- 空间复杂度 O(m+n)