1、问题描述
使用两个非空的链表来表示两个非负整数,其中链表的每个节点存储着数位上的一个数,且按照逆序存储。
将两数加和,返回一个新的链表来表示这两个数的和。
您可以假设除数字0外,这两个数都不会以0开头。
示例:
输入:(2->4->3)+(5->6->4)
输出:(7->0->8)
原因:342 + 465 = 807
2、解题思路
- 边界条件:(1)两条链表皆为空;(2)有一条链表为空;(3)两个n位数相加得到n+1位数,如55 + 60 = 125。(4)两条链表的位数相差很大,如2和1453;
- 思路分析:先声明一下所使用的数据结构,
- 三个迭代指针p1、p2,p1表示list1的迭代指针,p2表示list2的的迭代指针,p3表示加和后新链表的迭代指针;
- 加和后新链表的头节点dummyhead;
- 进位标志变量carry ,如果carry=true,代表需要进位;
- 初始化:刚开始令p1指向第一个链表list1的第一个节点,p2指向第二个链表list2的第一个节点;申请dummyhead节点;并令p3指向dummyhead节点
- 处理逻辑:
- p1、p2在list1、list2上进行同步迭代,如果p1、p2指向的节点均不为空,则申请一个新的节点new_node,将p1、p2所指向的两个节点之和赋值给new_node的值域,令p3的next指针指向new_node,p3=new_node;
- 如果p1指向的为空,而p2指向的不为空,则直接将p2及其后面的所有节点复制到p3后面;
- 如果p1指向的不为空,而p2指向的为空,则直接将p1及其后面的所有节点复制到p3后面。
3、代码实现
/**
* 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* p1;
ListNode* p2;
ListNode* p3;
bool carry;
ListNode dummyhead(0);
p1 = l1;
p2 = l2;
p3 = &dummyhead;
carry = false;
int value = 0;
ListNode* new_node = NULL;
while(p1 != NULL && p2 != NULL){
value = p1->val + p2->val;
if (carry == true){
value += 1;
}
carry = (value >= 10) ? true : false ;
if(value >= 10){
value -= 10;
}
new_node = new ListNode(value);
p3->next = new_node;
p3 = new_node;
p1 = p1->next;
p2 = p2->next;
}
while(p1 != NULL){
value = p1->val;
if(carry == true){
value += 1;
}
carry = (value >=10 ) ? true : false ;
if(value >= 10){
value -= 10;
}
new_node = new ListNode(value);
p3->next = new_node;
p3 = new_node;
p1 = p1->next;
}
while(p2 != NULL){
value = p2->val;
if(carry == true){
value += 1;
}
carry = (value >= 10) ? true : false;
if(value >= 10){
value -= 10;
}
new_node = new ListNode(value);
p3->next = new_node;
p3 = new_node;
p2 = p2->next;
}
if (carry == true){
new_node = new ListNode(1);
p3->next = new_node;
}
return dummyhead.next;
}
};