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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值