力扣刷题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 vl1;
        vector 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 v1;

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

        ListNode* l4 = new ListNode(0);
        ListNode* p1= l4;
       
        for(int i=0;inext=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 permutation(string s)
    {
          vector result;
          vector res;
          string temp_str="";
          for(int i=0;i

 

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


 

你可能感兴趣的:(面试题,力扣刷题记录)