力扣 两数相加 指针操作注意事项

11 篇文章 0 订阅
10 篇文章 0 订阅
  1. 两数相加
    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

链表数学运算的问题:写递归函数要考虑好两个问题:
1/什么时候是递归边界
2/如何防止运算过程中的访问越界问题
3/防止递归到下一层时越界

对于本问题1:当递归进行加操作时,走到了两个都是NULL的时候返回,1个不是NULL时说明还有数据,还要进行加操作的处理。递归边界一定要注意是真的递归边界,不会导致错误的递归边界。这里也就是判断没有加操作的强约束:就是两个表都是空表的时候。

对于问题2:当进行任何访问指针指向的内容比如r->val或是r->next 都要注意提前判断当前节点r是否为NULL

问题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) {

        if(l1==NULL&&l2==NULL)return l1;//边界强约束判定:防止两个0的结果 若是两个指针都已经指空了说明来到了指针尽头 返回
        int v1,v2;
        if(l1==NULL)v1 = 0;
        else v1 = l1->val;
        if(l2==NULL)v2 = 0;
        else v2 = l2->val;
        int sum = v1+v2;
        //+操作执行
        if(l1!=NULL)//判空
            l1->val = sum%10;
        else l1 = new ListNode(sum%10);
        if(sum>9){
            if(l1->next==NULL)
                l1->next = new ListNode(1);
            else l1->next->val+=1;
        }
        //递归防止越界递归
        ListNode *p1=l1,*p2=l2;
        if(p2==NULL)l1->next = addTwoNumbers(p1->next,p2);//如果p2空了说明2链表长度短 那么没必要传p2->next,因为此时p2本身就是空的
        else l1->next = addTwoNumbers(p1->next,p2->next);//p2不空 
        return l1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值