爬楼梯 动态规划
class Solution { public: int climbStairs(int n) { int p=0,q=0,r=1; for(int i=1;i<=n;i++){ p=q; q=r; r=p+q; } return r; } };
两数相加
好难!!!
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *head=nullptr,*tail = nullptr;
//定义一个进位数的指针,用来存储当两数之和大于10的时候
int carry = 0;
//当l1 不等于null或l2 不等于空时,就进入循环
while(l1||l2){
//如果l1 不等于null时,就取他的值,等于null时,就赋值0,保持两个链表具有相同的位数
int n1 = l1!=nullptr? l1->val:0;
//如果l1 不等于null时,就取他的值,等于null时,就赋值0,保持两个链表具有相同的位数
int n2 = l2!=nullptr?l2->val:0;
//将两个链表的值,进行相加,并加上进位数
int sum = n1+n2+carry;
if(!head){
//计算两个数的和,此时排除超过10的请况(大于10,取余数)
head = tail=new ListNode(sum%10);
}else{
//计算两个数的和,此时排除超过10的请况(大于10,取余数)
tail->next = new ListNode(sum%10);
tail = tail->next;
}
//计算进位数
carry = sum/10;
if(l1){
//当链表l1不等于null的时候,将l1 的节点后移
l1 = l1->next;
}
if(l2){
//当链表l2 不等于null的时候,将l2的节点后移
l2 = l2->next;
}
}
if(carry>0){
tail->next = new ListNode(carry);
}
return head;
}
};