关于求和问题 右侧对齐

我们先来看一个简单题

 思路: 我们大多数人看到这个题肯定想把字符串转化为数字 然后进行一顿操作(x)

因为字符串所表示的数的大小可能会大于int double longlong类型所能表示范围

正确思路 我们应该进行右侧对齐 然后设置一个变量判断是否有进位 然后返回

3//代码实现

class Solution {
public:
    string addBinary(string a, string b) {
         string res="";
        int n=a.size()-1;
        int m=b.size()-1;
        int  pre=0;//是否有向前进位
        int cur=0;
        while(n>=0 || m>=0){
            
            int cur =(n>=0?a[n]-'0':0)+(m>=0?b[m]-'0':0)+pre;
            res+=cur%2==0?'0':'1';
            pre=cur/2;
            n--;
            m--;
            
        }
        if(pre!=0){
            res+=pre+'0';
        }
          reverse(res.begin(),res.end());
        return res;
    }
}; 

 

如果把这个字符串改成链表应该如何操作呢

 我们还是一样的思路 我们还是从低位开始计算 我们应该 先把链表翻转 然后把计算结果进行再次翻转然后返回就得到了正确答案

思路 1.进行把两个链表进行翻转//  https://leetcode-cn.com/problems/reverse-linked-list/

         2.然后进行跟上一道题一样的操作

1.如何翻转链表 

代码实现:

  ListNode* reversList(ListNode *head){
        if(head==NULL) return NULL;
        ListNode*cur=head;
        ListNode* pre=NULL;
        while(cur!=NULL){
            ListNode *pnext=cur->next;
            cur->next=pre;
            pre=cur;
            cur=pnext;
        }
        return pre; 
    }

2.然后进行操作

   ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        //右侧对齐
     ListNode*r1=reversList(l1);
     ListNode*r2=reversList(l2);
     ListNode *dummy=new ListNode(0);
        ListNode* cur=dummy;
        int sum=0;
        int carry=0;//记录进位问题
      while(r1!=NULL || r2!=NULL)
      {
          cur->next = new ListNode(0);//新建节点
          cur = cur->next;
          int n1=0;
          if(r1!=NULL){
              n1=r1->val;
              r1=r1->next;
          }
             int n2=0;
              if(r2!=NULL){
                  n2=r2->val;
                  r2=r2->next;
              }
          sum=n1+n2+carry;
          carry=sum/10;
          cur->val=sum%10;
      }
        if(carry)
        {
            cur->next=new ListNode(1);
        }
        ListNode *r3=dummy->next;
       delete dummy;
        dummy = nullptr;
        ListNode* l3 = reversList(r3);
        return l3;
    }
};

这里应用了虚拟头结点需要接下来继续研究

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值