题目描述
You are given two linked lists representing two non-negative numbers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.
Example:
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 8 -> 0 -> 7
解题思路
本题的意思就是两个链表的节点从右往左两两相加,主要需要考虑进位。
题中说明不能转置原链表,因此考虑新开两个vector来存储两个链表的节点值,而后将对应同一位置的节点值想加。再new 两个ListNode,一个存储相加后的结果的节点值,另一个表示结果节点的next。
注意要用一个变量来存储进位的值,因为最后的结果有可能会比两个链表的长度更大。
复杂度分析
时间复杂度为O(N),空间复杂度为O(N)。
代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
vector<int>mylist1;
vector<int>mylist2;
while (l1) {
mylist1.push_back(l1->val);
l1=l1->next;
}
while (l2) {
mylist2.push_back(l2->val);
l2=l2->next;
}
int n1=mylist1.size();
int n2=mylist2.size();
int jinwei=0;
int sum=0;
ListNode* head=nullptr;
ListNode* p=nullptr;
for (int i=n1-1,j=n2-1; i>=0||j>=0||jinwei>0; i--,j--) {
sum=jinwei;
if (i>=0) {
sum+=mylist1[i];
}
if (j>=0) {
sum+=mylist2[j];
}
jinwei=sum/10;
p = new ListNode(sum%10);
p->next=head;
head=p;
}
return head;
}
};