LeetCode刷题日记第二天

1、
主站第二题
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

class Solution
{
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        ListNode * head=l1;
        //首先定义一个头结点,便于最后返回结果
        int flag=0;//flag用于判断是否有进位
        while(l1->next!=nullptr&&l2->next!=nullptr)
        //循环直到l1或l2中一个的next是空结点,为什么是判断下一个呢?
        //因为如果是l1!=nullptr&&l2!=nullptr,那么如果l1是空,那么l1后面就没办法接下一个结点了(如果有的话)
        {
            if(l1->val+l2->val+flag<10)
            {
                l1->val=l1->val+l2->val+flag;
                flag=0;
            }
            else
            {
                l1->val=l1->val+l2->val+flag-10;
                flag=1;//注意修改flag的值
            }
            l1=l1->next;
            l2=l2->next;
        }
        //现在已经出循环了,但l1->val和l2->val的值还没有累加,所以单独进行一步
        if(l1->val+l2->val+flag<10)
        {
            l1->val=l1->val+l2->val+flag;
            flag=0;
        }
        else
        {
            l1->val=l1->val+l2->val+flag-10;
            flag=1;
        }
        if(l1->next==nullptr&&l2->next==nullptr)
        //这步用于判断,是不是l1,l2后面都没有结点了,如果是的话,那l1和l2的长度就是一样的,就是比较简单的一种情况了
        {
        	//注意可能还会有进位,就像9+8=17一样,一位数加一位数的结果是两位数,有位数的变化,所有要判断
            if(flag==1)
            {
                l1->next=new ListNode(1);
            }
        }
        else
        //l1或l2有一个后面还有结点
        {
            if(l1->next==nullptr)
            {
            	//把l2的后半部分接到l1后面,因为我们主要运算都是在l1上进行的
                l1->next=l2->next;
                l1=l1->next;//就是这句没写,害的我的de了好久的bug
                while(l1->next!=nullptr)
                {
                    if(l1->val+flag<10)
                    {
                        l1->val=l1->val+flag;
                        flag=0;
                    }
                    else
                    {
                        l1->val=l1->val+flag-10;
                        flag=1;
                    }
                    l1=l1->next;
                }
            }
            else
            {
                l1=l1->next;
                while(l1->next!=nullptr)
                {
                    if(l1->val+flag<10)
                    {
                        l1->val=l1->val+flag;
                        flag=0;
                    }
                    else
                    {
                        l1->val=l1->val+flag-10;
                        flag=1;
                    }
                    l1=l1->next;

                }
            }
            if(l1->val+flag<10)
            {
                l1->val=l1->val+flag;
                flag=0;
            }
            else
            {
                l1->val=l1->val+flag-10;
                flag=1;
            }
            if(flag==1)
            {
                l1->next=new ListNode(1);
            }
        }
         return head;
    }
};

在这里插入图片描述
一步一步debug,一个bug,de了好久,终于解出来了,开心啊!>-<



2、
剑指offer 58 II
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

//法一
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        return s.substr(n,s.length()-n)+s.substr(0,n);
    }
};

//法二
//官方有一种算法,觉得很强
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        string res="";
        for(int i=n;i<n+s.length();i++){
        res+=s[i%s.length()];  //这一步取余真的太棒了!!!
    }
    return res;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开心星人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值