你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例 1:
输入: 7->1->6->null, 5->9->2->null
输出: 2->1->9->null
样例解释: 617 + 295 = 912, 912 转换成链表: 2->1->9->null
样例 2:
输入: 3->1->5->null, 5->9->2->null
输出: 8->0->8->null
样例解释: 513 + 295 = 808, 808 转换成链表: 8->0->8->null
对题目理解不好,数据类型换成long 解答:通过70%
class Solution {
public:
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
ListNode * addLists(ListNode * l1, ListNode * l2) {
// write your code here
stack<int> res1,res2;
if(l1==NULL ){
return l2;
}
if(l2==NULL){
return l1;
}
while(l1!=NULL){
res1.push(l1->val);
l1=l1->next;
}
while(l2!=NULL){
res2.push(l2->val);
l2=l2->next;
}
int len1=res1.size();
int len2=res2.size();
int num1 = 0;
while(len1--){
int temp1=res1.top()*pow(10,len1);
res1.pop();
num1 = num1+temp1;
}
int num2 = 0;
while(len2--){
int temp2=res2.top()*pow(10,len2);
res2.pop();
num2 = num2+temp2;
}
int num = num1+num2;
cout<<num<<endl;
vector<int> result;
while(num>=10){
int temp = num%10;
result.push_back(temp);
num=num/10;
}
result.push_back(num);
int l = result.size();
cout<<l<<endl;
ListNode* head = new ListNode(result[0]);
ListNode * temp =head;
for(int i=1;i<l;i++){
ListNode* node = new ListNode(result[i]);
cout<<node->val<<endl;
temp->next=node;
temp = node;
}
return head;
}
};
优秀解法:
/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
ListNode *addLists(ListNode *l1, ListNode *l2) {
// write your code here
ListNode *head = new ListNode(0);
ListNode *end = head;
ListNode *curr1 = l1;
ListNode *curr2 = l2;
int carry = 0;
// 深入理解题目,求和进位进到后面去了,所以从前往后遍历就行
while (curr1 != nullptr || curr2 != nullptr || carry != 0)
{
int a1 = 0;
int a2 = 0;
if (curr1 != nullptr)
{
a1 = curr1->val;
curr1 = curr1->next;
}
if (curr2 != nullptr)
{
a2 = curr2->val;
curr2 = curr2->next;
}
int sum = a1 + a2 + carry;
carry = sum / 10;
sum %= 10;
ListNode *curr = new ListNode(sum);
end->next = curr;
end = curr;
}
return head->next;
}
};
原文:https://www.cnblogs.com/Allen-rg/p/13647724.html