leetcode 2nd problem add two numbers

1.读题
a.倒序的两个链表,均不为空。
b.数据格式除了0以外开头不能为0。

2.思路
和数据结构选择的大作业类似,大整数加减,不过逆序无需构造循环链表。

3.反思
解题步骤清楚,但是变量的放置位置很有讲究,本来想对个位数做统一处理,发现逻辑上就有问题,因为,涉及到:
a.个位数加个位数,可能不进位的情况。
b.统一的流程只能是有一者或者两者指针移动的循环控制流,两者唯一确定的是都有个位,头结点必须保留作为返回值。

4.注意点和异常处理
a.指针移动要统一。
b.位数不对齐,时刻要考虑,一个链表为空,一个不为空的情况。
c.最后对进位统一处理。

5.代码

/**
 * 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 *sum=new ListNode((l1->val+l2->val)%10);
    int carry = (l1->val+l2->val)/10;
    ListNode* cur = sum;
    ListNode* pn1 = l1->next;
    ListNode* pn2 = l2->next;
        while(pn1!=NULL||pn2!=NULL)
        {


            while(pn1!=NULL&&pn2!=NULL)
            {
                ListNode *point = new ListNode((pn1->val+pn2->val+carry)%10);
                carry = (pn1->val+pn2->val+carry)/10;
                cur->next = point;
                cur = cur->next;
                pn1 = pn1->next;
                pn2 = pn2->next;
            }
            if(pn1!=NULL)
            {
                ListNode *point = new ListNode((pn1->val+carry)%10);
                carry = (pn1->val+carry)/10;
                cur->next = point;
                cur = cur->next;
                pn1 = pn1->next;
            }
            if(pn2!=NULL)
            {
                ListNode *point = new ListNode((pn2->val+carry)%10);
                carry = (pn2->val+carry)/10;
                cur->next = point;
                cur = cur->next;
                pn2 = pn2->next;  
            }


        }

    if(carry!=0)
    {
        ListNode *point = new ListNode(1);
        cur->next = point;
        cur = cur->next;  
    }
    return sum;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值