思路:
首先分4种情况讨论:
p1 ,p2 哨兵都存在 ,正常相加求和取余,分离个位和十位。个位存入新节点,十位给carry , p1++,p2++
p1存在,p2不存在,将carry带上和p2数字正常相加求和取余,分离个位和十位 ,个位存入新节点,十位给carry , p1++
p2存在,p1不存在,将carry带上和p1数字正常相加求和取余,分离个位和十位,个位存入新节点,十位给carry , p2++
p1,p2,都不存在,carry存在,将carry存入新节点置0,结束整个工作.
/**
* 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 = l1;
ListNode* p2 = l2;//两哨兵
ListNode* NewHead = NULL;//新链表的头
ListNode* p = NewHead;//新链表的哨兵
int sum = 0;//求和
int carry = 0;//进阶
while (p1 || p2||carry) {//p1.p2有一个存在
//二者均存在
if (p1 && p2) {
sum = p1->val + p2->val + carry;
carry = sum / 10;//十位
sum = sum % 10;//个位
if (!NewHead) {//第一个节点头节点为空
NewHead = new ListNode(sum);
p = NewHead;
}
else {
p->next= new ListNode(sum);
p = p->next;
}
p1 = p1->next; p2 = p2->next;
}
//有一个不存在
else if (!p1&&p2) {//p1不存在
//进位加p2无限挖过来
while (p2) {
sum = p2->val + carry;
carry = sum / 10;//十位
sum = sum % 10;//个位
if (!NewHead) {//第一个节点头节点为空
NewHead = new ListNode(sum);
p = NewHead;
}
else {
p->next = new ListNode(sum);
p = p->next;
}
p2 = p2->next;
}
}
else if (!p2&&p1) { //p2不存在
//进位加p1无限挖过来
while (p1) {
sum = p1->val + carry;
carry = sum / 10;//十位
sum = sum % 10;//个位
if (!NewHead) {//第一个节点头节点为空
NewHead = new ListNode(sum);
p = NewHead;
}
else {
p->next = new ListNode(sum);
p = p->next;
}
p1 = p1->next;
}
}
else {//p1,p2都不存在,但存在carry
p->next = new ListNode(carry);
p = p->next;
carry = 0;
}
}
return NewHead;
}
};