力扣刷题6月4 两数相加

Talk is cheap,show me your code!

2. 两数相加

难度中等4412

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

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

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

示例:

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

第一版暴力写,但还是有bug的

/**
 * 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(nullptr == l1) return l2;
        if(nullptr == l2) return l1;
        
        if(nullptr == l1->next &&l1->val==0 )
        {
            return l2;
        } 
        if(nullptr == l2->next &&l2->val==0 )
        {
            return l1;
        } 
       
        ListNode* l11 = l1;
        ListNode* l22 = l2;

        vector<int> vl1;
        vector<int> vl2;
        int res1 = 0;
        int res2 = 0;

        int result =0;

        while(l11)
        {
            vl1.push_back(l11->val);//243
            l11=l11->next;
        }
        reverse(vl1.begin(),vl1.end());//342
        while(l22)
        {
            vl2.push_back(l22->val);//564
            l22=l22->next;
        }
        reverse(vl2.begin(),vl2.end());//456
        
        for(int i=0;i<vl1.size();i++)
        {
            res1=res1*10+vl1[i];
        }
        for(int i=0;i<vl2.size();i++)
        {
            res2=res2*10+vl2[i];
        }

        result = res1 + res2;//
        vector<int> v1;

        while(result)
        {
            v1.push_back(result%10);
            result = result/10;
        }

        ListNode* l4 = new ListNode(0);
        ListNode* p1= l4;
       
        for(int i=0;i<v1.size() ; i++)//708
        { 
            ListNode* l5 = new ListNode(v1[i]);
            p1->next=l5;
            p1=l5;
        }
        return l4->next;
    }
};

 

第二版:别人的好办法

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode dummy (0);
    ListNode* p = &dummy;
    int sum = 0;
    while(l1 || l2 || sum)
    {
        if(l1) 
        { 
            sum += l1->val;
            l1 = l1->next;
        }
        if(l2)  
        {
            sum += l2->val;
            l2 = l2->next;
        }
        p->next = new ListNode(sum % 10);           //sum % 10为当前位的值
        p = p->next;
        sum /= 10;                              //sum/10为进位的值,并用做下一次求和的初值
    }
    return dummy.next;
    }
};

 

面试题38. 字符串的排列

难度中等46收藏分享切换为英文关注反馈

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:

输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]

限制:

1 <= s 的长度 <= 8

class Solution {
public:
    vector<string> permutation(string s)
    {
          vector<char> result;
          vector<string> res;
          string temp_str="";
          for(int i=0;i<s.size();i++)
          {
              result.push_back(s.at(i));
          }

          sort(result.begin(),result.end());//这边是防止next_permutation字典序列举的时候少元素
          
          do{
               temp_str = "";
               for(int i=0;i<s.size();i++)
               {
                   temp_str = temp_str+result[i];
               }
              res.push_back(temp_str);
          }while(next_permutation(result.begin(),result.end()));

          return res;
    }
};

 

/*next_permutation(start,end),和prev_permutation(start,end)。这两个函数作用是一样的,区别就在于前者求的是当前排列的下一个排列,后一个求的是当前排列的上一个排列。至于这里的“前一个”和“后一个”,我们可以把它理解为序列的字典序的前后*/
class Solution {
public:
    vector<string> permutation(string s) {
        if(s.empty()) return {};
        sort(s.begin(), s.end());
        vector<string> ans;
        ans.push_back(s);
        while(next_permutation(s.begin(), s.end())){
            ans.push_back(s);
        }
        return ans;
    }
};


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值