思路:
首先分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都不存在,但存在carryp->next = new ListNode(carry);p = p->next;carry = 0;}}return NewHead;}
};