题目链接
题目描述
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 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)
