链表求和
2017-03-31 13:58
211 查看
问题描述:你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中
样例:给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null
实现思路:由题意整数在链表中的存储是原来整数中相反的顺序,所以考虑申请一个新链表,让原来两个链表对应位置相加,除10取余作为新链表的当前元素,并且要考虑进位,这是总体的思路。在具体写代码的时候,首先考虑特殊情况,两个链表有空链表的情况,这是就相当于对一个链表进行操作就可以。当两个链表都不空时,就是都从头开始遍历,用一个while循环来实现:
(1)开始时先初始化一个变量x作为进位的数字,初始化为0;定义整型变量sum等于两个链表对应位置的数字和前一位的进位的和;
(2)将求得的和sum除10 赋值给x,作为新的要进位的数字;除10取余就是当前位置的元素;
(3)新链表和两个链表的指针后移。重复执行上述操作。
考虑到两个链表有可能不一样长,那么就是遍历完较短链表时就会跳出while循环了,那么这是我们就要继续考虑剩下的那个链表接着遍历的情况。特别注意的还有如果最后一位还要进位的话,那么还要重新申请一个结点,复制以后链接到新链表最后。
实现代码:
* 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) {
ListNode *p1=l1;
ListNode *p2=l2;
if(p1==NULL)
return p2;
if(p2==NULL)
return p1;
ListNode *head=new ListNode(0);
ListNode *p3=head;
int x=0;
while(p1!=NULL&&p2!=NULL)
{int sum=p1->val+p2->val+x;
x=sum/10;
sum=sum%10;
ListNode *s=new ListNode(sum);
p3->next=s;
p3=p3->next;
p1=p1->next;
p2=p2->next;
}
while(p1!=NULL)
{int sum=p1->val+x;
x=sum/10;
sum=sum%10;
ListNode *s=new ListNode(sum);
p3->next=s;
p3=p3->next;
p1=p1->next;
}
while(p2!=NULL)
{int sum=p2->val+x;
x=sum/10;
sum=sum%10;
ListNode *s=new ListNode(sum);
p3->next=s;
p3=p3->next;
p2=p2->next;
}
if(x!=0)
{ListNode *s=new ListNode(1);
p3->next=s;
p3=p3->next;
}
return head->next;}
};
做题感想:这个题需要考虑的细节比较多,同时有新链表和原来的两个链表的指针的移动情况需要考虑清楚,还有两个链表不一样长的情况。最后特别要注意最后一位要进位的话,那么还要重新申请一个结点,复制以后链接到新链表最后。
相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例:给出两个链表 3->1->5->null 和 5->9->2->null,返回 8->0->8->null
实现思路:由题意整数在链表中的存储是原来整数中相反的顺序,所以考虑申请一个新链表,让原来两个链表对应位置相加,除10取余作为新链表的当前元素,并且要考虑进位,这是总体的思路。在具体写代码的时候,首先考虑特殊情况,两个链表有空链表的情况,这是就相当于对一个链表进行操作就可以。当两个链表都不空时,就是都从头开始遍历,用一个while循环来实现:
(1)开始时先初始化一个变量x作为进位的数字,初始化为0;定义整型变量sum等于两个链表对应位置的数字和前一位的进位的和;
(2)将求得的和sum除10 赋值给x,作为新的要进位的数字;除10取余就是当前位置的元素;
(3)新链表和两个链表的指针后移。重复执行上述操作。
考虑到两个链表有可能不一样长,那么就是遍历完较短链表时就会跳出while循环了,那么这是我们就要继续考虑剩下的那个链表接着遍历的情况。特别注意的还有如果最后一位还要进位的话,那么还要重新申请一个结点,复制以后链接到新链表最后。
实现代码:
* 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) {
ListNode *p1=l1;
ListNode *p2=l2;
if(p1==NULL)
return p2;
if(p2==NULL)
return p1;
ListNode *head=new ListNode(0);
ListNode *p3=head;
int x=0;
while(p1!=NULL&&p2!=NULL)
{int sum=p1->val+p2->val+x;
x=sum/10;
sum=sum%10;
ListNode *s=new ListNode(sum);
p3->next=s;
p3=p3->next;
p1=p1->next;
p2=p2->next;
}
while(p1!=NULL)
{int sum=p1->val+x;
x=sum/10;
sum=sum%10;
ListNode *s=new ListNode(sum);
p3->next=s;
p3=p3->next;
p1=p1->next;
}
while(p2!=NULL)
{int sum=p2->val+x;
x=sum/10;
sum=sum%10;
ListNode *s=new ListNode(sum);
p3->next=s;
p3=p3->next;
p2=p2->next;
}
if(x!=0)
{ListNode *s=new ListNode(1);
p3->next=s;
p3=p3->next;
}
return head->next;}
};
做题感想:这个题需要考虑的细节比较多,同时有新链表和原来的两个链表的指针的移动情况需要考虑清楚,还有两个链表不一样长的情况。最后特别要注意最后一位要进位的话,那么还要重新申请一个结点,复制以后链接到新链表最后。
相关文章推荐
- 链表实现多项式求和求积
- leetcode之链表类之链表归并类-----OJ 2/21/23/445 链表相加求和 链表归并
- 链表求和 II
- 链表元素求和的伪递归优化
- 链表求和(容易)
- javal链表相加求和!
- 链表求和II
- 程序员面试金典(6)两个链表逆向表示的整数求和
- LeetCode 2. Add Two Numbers(单链表求和)
- 单链表应用--一元多项式求和
- 链表求和
- lintcode-【简单题】链表求和
- 链表求和
- 作业11.167:链表求和
- 数字求和——链表
- lintcode 链表求和
- 面试题整理-链表形式大数求和
- 链表求和
- Linkcode 167 链表求和
- LintCode-[中等] 221. 链表求和 II