Leetcode(2)——两数相加(分三种情况讨论所有可能性)

       关于Leetcode的刷题方法,在网上看了很多,每个人都有着不同的见解。作为Leetcode小白,我还是决定用最原始的方法进行刷题,即把每一题的思路都记录下来,虽然比较耗时间,但是个人感觉这样子的方法会让我对题目有更深入的了解。希望能在该专栏中记录下刷题过程中遇到的大大小小的问题🍊。

题目描述

在这里插入图片描述

  • 题目模板如下:
    在这里插入图片描述

解题思路

  • 本题考察的是链表的知识点,难点有两个:
  1. 若两个数字的位数不同,如何处理多余的位数
  2. 若产生进位,应当如何处理
  • 首先创建两个指针分别指向两个数字的第一位,创建存放最终结果的指针p

  • 情况1.处理两个数都含有的位数,然后再对多余位数进行处理。

    • 如果当前位数在两个数字中均存在,则计算指针p在该位数上的结果。
    • 让两个指针向后挪一位
    • 若两个指针均不为NULL,则表示下一次循环仍归属于当前的大前提中,此时为指针p分配下一个空间:
      • 若无进位,则分配下一个位置的空间时候的初始化值为0
      • 若有进位,首先对当前值减去10,则分配下一个位置时候的空间的初始化值为1
  • 情况2.指向两个数的指针有一个不为NULL,另一个为NULL

    • 此时我们仍然需要为p分配新的空间,然后为其赋值
    • 需要注意的一点:此时仍然需要考虑进位的问题,因为情况1最后处理完的一个循环结束之后是可能存在进位问题的。
  • 情况3.上面我们提到,如果执行完情况1之后进入了情况2,若进位,会在情况2里面处理进位。但是如果执行完情况1不进入情况2,此时仍然存在进位问题,因此需要在情况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) {
        ListNode * result = new ListNode(0),*p = result,*x1 = l1,*x2 = l2;
        	//情况1:x1,x2均存在
            while(x1 && x2){
                p->val += x1->val + x2->val;
                x1 = x1->next;	
                x2 = x2->next;
                //处理进位问题,并根据是否进位决定p新分配的空间初始化的值为多少
                if(x1 && x2){
                    if(p->val >=10){
                        p->val-=10;
                        p->next = new ListNode(1);
                    }
                    else{
                        p->next = new ListNode(0); 
                    }
                    p = p->next;
                }
            }        
            //情况2:x1,x2有且仅有一个存在
            while(x1 || x2){
                 if(p->val >=10){		//处理进位问题,并分配新的空间
                    p->val-=10;
                    p->next = new ListNode(1);
                 } 
                else{
                    p->next = new ListNode(0); 
                }
                p = p->next;			//指向新的空间
                if(x1){					//计算p的val值
                    p->val += x1->val;
                    x1 = x1->next;
                }
                else{
                    p->val += x2->val;
                    x2 = x2->next;                  
                }
            }
            //情况3:处理情况1之后未进位的问题
            if(p->val >=10){
                p->val-=10;
                p->next = new ListNode(1);
            } 
            return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值