“两数相加”专题

每一位相加,比如a,b相加,sum=a+b+flag

(1)进位flag=sum%10

(2)这一位变成:sum=sum/10

然后进位flag送到下一轮去

1.力扣2 两数之和

 题目意思如下:

 要注意下面这种情况:最高位还要向前进1

class Solution 
{
    public ListNode addTwoNumbers(ListNode l1, ListNode l2)
    {
        //构造一个头结点 
        ListNode dummy=new ListNode(-1);

        //再整一个当前节点,初始时,当前节点等于dummy节点
        ListNode current=dummy;

        //进位标志
        int flag=0;

        //只要还有一个链表有数字,就要继续相加
        while(l1!=null||l2!=null)
        {
            int num1=0,num2=0,sum=0;
            if(l1!=null)
            {
               num1=l1.val;
            }
    
            if(l2!=null)
            {
                num2=l2.val;
            }
        
            sum=num1+num2+flag;
           
            //进位为flag/10
            flag=sum/10;
            //新节点的值为sum%10
            ListNode new_node=new ListNode(sum%10);
            current.next=new_node;
           

           //接下来就是将三个指针往后移l1.next,l2.next,current.next
            if(l1!=null)
            {
                l1=l1.next;
            }
            if(l2!=null)
            {
                l2=l2.next;
            }
            current=current.next;
        }
        //跳出循环,此时l1,l2都为空了,此时判断一下是否还有进位
        //如果有进位,就还要再new一个新节点
        if(flag==1)
        {
            ListNode new_node=new ListNode(1);
            current.next=new_node;
        }
        return dummy.next;
    }
}

​​​​​​力扣445  两数相加||

两数相加|和两数相加||之间的区别: 

即两数相加|第一个链表节点是低位

而两数相加||第一个链表节点是高位

2.力扣66 加一

class Solution 
{
    public int[] plusOne(int[] nums) 
    {
        int flag=1;
        for(int i=nums.length-1;i>=0;i--)
        {
            nums[i]=nums[i]+flag;
            //flag表示进位
            flag=nums[i]/10;
            
            nums[i]=nums[i]%10;
        }
        if(flag==1)
        {
            int[]  result=new int[nums.length+1];
            result[0]=1;
            for(int i=0;i<nums.length;i++)
            {
                result[i+1]=nums[i];
            }
            return result;
        }
        return nums;
    }
}

3.力扣67  二进制求和

class Solution 
{
    public String addBinary(String a, String b) 
    {
        int n1=a.length()-1;
        int n2=b.length()-1;
        //用flag来记录进位
        int flag=0;
        
        StringBuilder result=new StringBuilder();

        //从最后一位开始相加:
        while(n1>=0&&n2>=0)
        {
            //在ascii表种字符'0'的ascii码值是48,字符'1'的ascii码值是49
            //我们想将一个0~9的字符转化成数字,就将这个字符减去'0'就可以将字符转化为数字
            int sum=a.charAt(n1)-'0'+b.charAt(n2)-'0'+flag;
            
            //当sum>2时,flag=1
            flag=sum/2;
            
            sum=sum%2;

            result.append(sum);
            n1--;
            n2--;
        }
        //跳出这个循环,说明有一个字符串还没加完
        while(n1>=0)
        {
            //这里的代码复制上面的即可
            int sum=a.charAt(n1)-'0'+flag;
            flag=sum/2;

            sum=sum%2;

            result.append(sum);
            n1--;

        }
        while(n2>=0)
        {
            int sum=b.charAt(n2)-'0'+flag;
            flag=sum/2;

            sum=sum%2;

            result.append(sum);
            n2--;

        }
        //如果最后还有进位,就要把进位也加进来
        if(flag>0)
        {
            result.append(flag);
        }
        //得到的结果是逆序的,所以最后还要反转一下
        return result.reverse().toString();
    }
}

4.力扣415 字符串相加

class Solution 
{
    public String addStrings(String string1, String string2) 
    {
        //4 5 6
        //  7 7
        //5 3 3
        //从字符串最后一位加到第一位,所以i,j初始值是string1.length( ) - 1,string2.length( ) - 1;
        int i =string1.length( ) - 1;
        int j =string2.length( ) - 1;

        int flag = 0;

        StringBuilder result = new StringBuilder( );

        while (i >= 0 || j >= 0)
        {
            
            int num1=0,num2=0,sum=0;
            if (i >= 0) 
            {
                num1 = string1.charAt( i ) - '0';
            } 
            if (j >= 0) 
            {
                num2= string2.charAt(j) - '0';
            } 
            sum= num1 + num2 + flag;
            
            flag=sum/10;
            sum=sum%10;

            result.append( sum % 10 );
            i--;
            j--;
        }
        if (flag == 1)
        {
            result.append( 1 );
        }
        return result.reverse( ).toString( ) ;  // write code here
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值