力扣 66加一 LRC142训练计划IV

发布于:2024-12-22 ⋅ 阅读:(13) ⋅ 点赞:(0)

力扣:66.加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头

示例:

输入:digits = [1, 2, 3]

输出:[1, 2, 4]

解释:输入数组表示数组123。

解题思想:

通过从数组的最后一位开始遍历,执行加一操作,目的为了模拟手动加一的过程。

在每一位执行加一操作后,判断是否需要进位。如果当前位加一后等10,那么将当前位设置为0,继续向前遍历并前一位加一。直到遇到不需要进位的位或遍历完整个数组。

如果在遍历过程中遇到了不需要进位的位,那么加法操作已经完成,直接返回修改后的数组即可。

如果遍历完整个数组后仍有进位,即最高位(digits[0])需要进位,那么就在数组最前面插入一个元素1来进行进位操作。

代码:

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        for(int i = digits.size() - 1; i>=0; i--)
        {
            digits[i]++;
            if(digits[i] == 10)  digits[i] = 0;
            else  return digits;
        }
        digits.insert(digits.begin(), 1);
        return digits;
    }
};

力扣:LRC 142.训练计划IV

给定两个以 有序链表 形式记录的训练计划 l1、l2,分别记录了两套核心肌群训练项目编号,请合并这两个训练计划,按训练项目编号 升序 记录于链表并返回。

注意:新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:l1 = [1, 2, 4],l2 = [1, 3, 4]

输出:[1, 1, 2, 3, 4, 4]

解题思想:

使用迭代的方法。当l1和l2都不是空链表时,判断l1和l2哪一个链表的头节点的val值更小,将较小值的节点添加到结果里,放一个节点被添加到结果里后,将对应链表中的节点向后移一位。

首先,要先设定一个哨兵节点Head,用于最后返回合并后的链表。然后维护一个pre指针。

如果l1当前节点的值小于等于l2,就把l1当前的节点接在pre节点的后面,同时将l1指针向后移动一位。否则,我们就对l2做同样的操作。不管我们将哪个元素接到后面,都需要把pre向后移动一位,往复直至l1或l2指向null。

循环终止时,l1和l2最多有一个是非空的。由于出入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有的元素都比前边的已经合并链表中的所有元素都要大。所以只需要将非空链表接在合并链表的后面,并返回。

代码:

class Solution {
public:
    ListNode* trainningPlan(ListNode* l1, ListNode* l2) {
        ListNode*Head=new ListNode(-1);
        ListNode*pre=Head;
        while(l1&&l2){
            if(l1->val<=l2->val){
                pre->next=l1;
                l1=l1->next;
            }
            else{
                pre->next=l2;
                l2=l2->next;
            }
            pre=pre->next;
        }
        if(l1) pre->next=l1;
        if(l2) pre->next=l2;
        return Head->next;
    }
};

祝大家生活愉快。