[日常刷题]LeetCode第十天

83. Remove Duplicates from Sorted List

Given a sorted linked list, delete all duplicates such that each element appear only once.
Example 1:

Input: 1->1->2
Output: 1->2

Example 2:

Input: 1->1->2->3->3
Output: 1->2->3

Solution in C++:

  • 关键点:删除时指针挪动的时机 && 比较顺序
  • 思路:顺序扫描链表,当前位置与下一位置的元素进行对比,相同则删除,不同就继续。逻辑搞清楚,没什么难度。
/**
 - Definition for singly-linked list.
 - struct ListNode {
 -     int val;
 -     ListNode *next;
 -     ListNode(int x) : val(x), next(NULL) {}
 - };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* ptr = head;
        if(ptr == nullptr)
            return head;
        
        while(ptr->next){
            if(ptr->val == ptr->next->val)
            {
                ListNode *tmp = ptr->next;
                ptr->next = ptr->next->next;
                free(tmp);
            } else{
                ptr = ptr->next;
            }
        }
        return head;
    }
};

88. Merge Sorted Array

Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:

  • The number of elements initialized in nums1 and nums2 are m and n respectively.
  • You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.
    Example:
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

Output: [1,2,2,3,5,6]

Solution in C++:

  • 关键点:覆盖nums1中的值,而不是插入新值
  • 思路:如果nums2中的值比nums1小时一定需要将nums1中的值向后挪动,当不需要挪动的时候,一定是nums2的值大于nums1中最后一个值时。扫描nums1中的输入值,每次比较需要往后挪动的时候将nums1的真实大小m+1,当i扫到nums1最后一个值时,将nums2赋值给nums1最后一个值之后,接下来如果nums2还剩余元素,直接赋值给nums1中的后续元素。
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        size_t i, j;
        size_t size = nums1.size();
        
        for(i = 0, j = 0; i < m && j < n; ++i)
        {
            if(nums1[i] > nums2[j]){
                for(int k = m; k > i; --k){
                    nums1[k] = nums1[k-1];
                }
                nums1[i] = nums2[j];
                ++m; 
                ++j;
            } else if((nums1[i] < nums2[j]) && (i==m-1)){
                nums1[++i] = nums2[j];
                ++j;
            }
                
        }
        
        if(i >= m)   // nums1输入长度小于nums2
        {
           while(j != n){
                nums1[i] = nums2[j];
                ++j;
                ++i;
           }
               
        }
    }

100. Same Tree

Given two binary trees, write a function to check if they are the same or not.

Two binary trees are considered the same if they are structurally identical and the nodes have the same value.
Example 1:

Input:     1         1
          / \       / \
         2   3     2   3

        [1,2,3],   [1,2,3]

Output: true

Example 2:

Input:     1         1
          /           \
         2             2

        [1,2],     [1,null,2]

Output: false

Example 3:

Input:     1         1
          / \       / \
         2   1     1   2

        [1,2,1],   [1,1,2]

Output: false

Solution in C++:

  • 关键点:树的遍历
  • 思路:按树完全遍历,如果结点指针不是都为空就说明结构不一致,如果对应位置值不一致也不是相同的树。标☆的代码处,因为要遍历完树的所有部分才能return true,所以不能把这里写上如果值相同就return true
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSameTree(TreeNode* p, TreeNode* q) {
        if(p == nullptr && q == nullptr)
            return true;
        else if(p == nullptr || q == nullptr)
            return false;
        
        // 值相同且位置相同
        if( p->val != q->val )     // ☆
            return false;
        
        bool left = isSameTree(p->left,q->left);
        bool right = isSameTree(p->right,q->right);
        return left && right;
    }
};

小结

nice day,虽然第二题的一点逻辑搞了很久,但是今天总的来说都是自己码的代码,还是有点成就感的。然后还复习了几个知识点。

知识点总结

  • 链表遍历及操作
  • vector操作(这里我复习了insert的用法,虽然最终的代码没体现)
  • 树的遍历及递归函数
Python 是一种流行的高级编程语言,因其简洁易读的语法和广泛的应用领域而受到开发者喜爱。LeetCode 是一个在线编程平台,专门用于算法和技术面试的准备,提供了大量的编程题目,包括数据结构、算法、系统设计等,常用于提升程序员的编程能力和解决实际问题的能力。 在 Python 中刷 LeetCode 题目通常涉及以下步骤: 1. **注册账户**:首先在 LeetCode 官网 (https://leetcode.com/) 注册一个账号,这样你可以跟踪你的进度和提交的代码。 2. **选择语言**:登录后,在个人主页设置中选择 Python 作为主要编程语言。 3. **学习和理解题目**:阅读题目描述,确保你理解问题的要求和预期输出。题目通常附有输入示例和预期输出,可以帮助你初始化思考。 4. **编写代码**:使用 Python 编写解决方案,LeetCode 提供了一个在线编辑器,支持实时预览和运行结果。 5. **测试和调试**:使用给出的测试用例来测试你的代码,确保它能够正确地处理各种边界条件和特殊情况。 6. **提交答案**:当代码完成后,点击 "Submit" 提交你的解法。LeetCode 会自动运行所有测试用例并显示结果。 7. **学习他人的代码**:如果遇到困难,可以查看社区中的其他优秀解法,学习他人的思路和技术。 8. **反复练习**:刷题不是一次性的事情,通过反复练习和优化,逐渐提高解题速度和代码质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值