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;
}
};