Lintcode167.链表求和C++
2017-03-28 22:04
239 查看
1.问题描述:你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中
2.解题思路:从两条链表的最开始节点一个个相加每的个节点只能存取<10的元素,所以直接对于每次节点相加的值取余,保存取余之后的值,通过/10来保存进位的值,每次存入值的时候就新建节点来保存数据,还要判断两条链表的情况,根据是否为空,那一条先为空来分类,最后总结写出代码。注意不要空间复杂度和时间复杂度不要太高。
3.通过的代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), 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
if(l1==NULL&&l2==NULL) return NULL;
ListNode *head=new ListNode(0);
ListNode *rear=head;
int m=0;
while(l1!=NULL&&l2!=NULL)
{
m=l1->val+l2->val+m;
rear->next=new ListNode(m%10);
l1=l1->next;
l2=l2->next;
rear=rear->next;
m=m/10;
}
ListNode *temp;
if(l1==NULL){temp=l2;}else{temp=l1;}
while(temp!=NULL)
{
m=temp->val+m;
rear->next=new ListNode(m%10);
temp=temp->next;
rear=rear->next;
m=m/10;
}
if(m==1)
rear->next=new ListNode(1);
return head->next;
}
};
4.感想:
做这道题简直一波三折,刚开始觉得好难啊,怎么写啊,不知道怎么写,但是看以前的解决问题的代码的时候突然来了思路,清清楚楚的搞懂了题意,自己就开始写代码,自己刚开始写的就是分很多种情况,程序很长,提交的代码就是wrong answer 改正了一些小错误之后 又出现runtime error,运行时出现错误,我觉得自己代码是正确的,自己也画图验证了很多次,但是每次都是这个错误,自己看了看是自己在创建节点的时候出现了错误。改过的还是没有通过。我在百度上搜索了一下答案,感觉我们的思路是差不多,只是我的有些繁琐,我又自己简化了一下程序,还是一直出现错误MLE,说我空间复杂度太高了,一直不让我通过。问了问其他人,他们有的人也有这样的错误,他们让我把有些两步的步骤融合成了一步。之后就通过了,最后对于这道题对于我来说也是最印象深刻的一道题,从开始思考思路到真正的通过用了两天半的时间,对于他的不能通过的原因还是没有太明白,下一步会问问同学或者是老师搞明白的。
相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和
2.解题思路:从两条链表的最开始节点一个个相加每的个节点只能存取<10的元素,所以直接对于每次节点相加的值取余,保存取余之后的值,通过/10来保存进位的值,每次存入值的时候就新建节点来保存数据,还要判断两条链表的情况,根据是否为空,那一条先为空来分类,最后总结写出代码。注意不要空间复杂度和时间复杂度不要太高。
3.通过的代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), 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
if(l1==NULL&&l2==NULL) return NULL;
ListNode *head=new ListNode(0);
ListNode *rear=head;
int m=0;
while(l1!=NULL&&l2!=NULL)
{
m=l1->val+l2->val+m;
rear->next=new ListNode(m%10);
l1=l1->next;
l2=l2->next;
rear=rear->next;
m=m/10;
}
ListNode *temp;
if(l1==NULL){temp=l2;}else{temp=l1;}
while(temp!=NULL)
{
m=temp->val+m;
rear->next=new ListNode(m%10);
temp=temp->next;
rear=rear->next;
m=m/10;
}
if(m==1)
rear->next=new ListNode(1);
return head->next;
}
};
4.感想:
做这道题简直一波三折,刚开始觉得好难啊,怎么写啊,不知道怎么写,但是看以前的解决问题的代码的时候突然来了思路,清清楚楚的搞懂了题意,自己就开始写代码,自己刚开始写的就是分很多种情况,程序很长,提交的代码就是wrong answer 改正了一些小错误之后 又出现runtime error,运行时出现错误,我觉得自己代码是正确的,自己也画图验证了很多次,但是每次都是这个错误,自己看了看是自己在创建节点的时候出现了错误。改过的还是没有通过。我在百度上搜索了一下答案,感觉我们的思路是差不多,只是我的有些繁琐,我又自己简化了一下程序,还是一直出现错误MLE,说我空间复杂度太高了,一直不让我通过。问了问其他人,他们有的人也有这样的错误,他们让我把有些两步的步骤融合成了一步。之后就通过了,最后对于这道题对于我来说也是最印象深刻的一道题,从开始思考思路到真正的通过用了两天半的时间,对于他的不能通过的原因还是没有太明白,下一步会问问同学或者是老师搞明白的。
相关文章推荐
- lintcode add-two-numbers 链表求和
- LintCode 链表求和 问题解答
- lintcode-【简单题】链表求和
- LintCode之167 链表求和
- LintCode:链表求和
- lintcode 167 链表求和
- 167. 链表求和(add-two-numbers)(c++)----lintcode面试题之链表
- LintCode- 链表倒数第n个节点
- LintCode复制带随机指针的链表
- LintCode Remove Duplicates from Sorted List 删除链表中的重复元素
- Lintcode 两个链表的交叉
- lintcode——删除链表中倒数第n个节点(链表)
- LintCode-两个链表的和
- LintCode Add Binary 二进制求和
- lintcode 容易题:Partition List 链表划分
- lintcode :链表插入排序
- lintcode 容易题:Remove Nth Node From End of Lis 删除链表中倒数第n个节点
- LintCode解题笔记 - 在O(1)时间复杂度删除链表节点
- lintcode 容易题:Add Binary 二进制求和
- LintCode Delete Node in the Middle of Singly Linked List 在O(1)时间复杂度删除链表节点