Leetcode 2 两数相加 学习感悟

思路: 

首先分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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值