Leetcode–2. 两数相加(链表的操作)
前言
- 这一题其实并不难,但是我还是疏忽出了点错误。首先,对该题的第一直觉是链表表示转化为int整型,然后求和后再转化为链表。但是缺疏忽了万一链表长度很长,令求和结果位数过多而导致数据溢出。所以这种解法很有局限性。
- 该题应该从链表的角度上去思考,这样就能避免由于位数过多而导致的数据溢出。需要考虑两个链表的长度问题,利用两个链表的指针同时平移,若某一指针下一个为空,则停止其移动,计算另一链表与进位的求和结果。
- 该题还有一个小细节就是进位的处理,我们可以设立一个进位元素,保存进位情况,每一次由两个链表对应节点元素与进位元素的求和作为当前步骤的值。
- 在leetcode中要记得排除对空指针的引用。
题目
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/*错误代码段*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
long long num1 = transform(l1);
long long num2 = transform(l2);
long long sum = num1+num2;
auto l3 = new ListNode();
l3 = transback(sum);
return l3;
}
long long transform(ListNode* l){
long long tmp = 0;
long long time = 0;
while(l->next !=NULL){
tmp = tmp + pow(10,time)*l->val;
l = l->next;
time++;
}
tmp = tmp+pow(10,time)*l->val; //会溢出
return tmp;
}
ListNode* transback(long num){
ListNode* root1 = new ListNode(num%10);
num = num/10;
ListNode* root2 = root1;
while(num){
ListNode* newnode =new ListNode(num%10);
root1->next = newnode;
num = num/10;
root1 = root1->next;
}
return root2;
}
};
/*正确代码*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* res = new ListNode(-1); //存放结果的指针
ListNode* p = res; //结果链表指针
int sum=0;
bool flag=false;
while(l1!=NULL||l2!=NULL){//排除空指针的引用
sum=0;
if(l1!=NULL){
sum += l1->val;
l1 = l1->next;
}
if(l2!=NULL){
sum += l2->val;
l2 = l2->next;
}
if(flag){
sum++;
}
p->next = new ListNode(sum%10);
flag = sum>=10?true:false;
p = p->next;
}
if(flag)
p->next = new ListNode(1);
return res->next;
}
};
附
可以调用pow(int x, int y)求x的y次幂
leetcode排除空指针的引用