8.13 刷题记录(4道题)

news2024/12/28 5:59:46

8.13 刷题记录

    • 6. 反转链表
        • 方法一: 迭代
        • 方法二:递归
    • 7. 合并两个排序的链表
    • 8. 复杂链表的复刻
    • 9. 二叉搜索树与双向链表

6. 反转链表

原题链接

在这里插入图片描述

方法一: 迭代

1 -> 2 -> 3 -> 4
i j

1 <- 2 -> 3 -> 4
i j
就像这样迭代

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *prev = nullptr;
        ListNode *cur = head;
        while (cur)
        {
            ListNode *next = cur->next;
            cur->next = prev;
            prev = cur, cur = next;
        }
        return prev;
    }
};

方法二:递归

1->2->3->4

因为用递归,翻转顺序指定是
从后往前

但是注意的是,返回的值应该是头节点,也就是4的值

那么如何递归?

  1. 接收返回值
  2. 递归当前两个节点
  3. 返回返回值
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode *tail = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        return tail;
    }
};
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null)
            return null;
        ListNode l = head.next;
        head.next = null;
        while(l != null){
            ListNode ll = l.next;
            l.next = head;
            head = l;
            l = ll;
        }
        return head;
    }
}

7. 合并两个排序的链表

原题链接
在这里插入图片描述
定义一个头节点,然后定义一个链表cur指向辅助

主要是完成

直接在两个表上的链路连接

比如 1->3 2->4合并

因为1小于2
那么直接让1->2(前提 l1的角标已经移到3)
如图
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* merge(ListNode* l1, ListNode* l2) {
        ListNode *dummy = new ListNode(0);
        ListNode *cur = dummy;
        while (l1 != NULL && l2 != NULL) {
            if (l1 -> val < l2 -> val) {
                cur -> next = l1;
                l1 = l1 -> next;
            }
            else {
                cur -> next = l2;
                l2 = l2 -> next;
            }
            cur = cur -> next;
        }
        cur -> next = (l1 != NULL ? l1 : l2);
        return dummy -> next;
    }
};
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode merge(ListNode l1, ListNode l2) {
        // 1. 先判空
        if(l1 == null) return l2;
        if(l2 == null) return l1;
        
        // 2. 创建头节点 便于返回答案
        ListNode Head = new ListNode(0);
        ListNode cur = Head;
        
        while(l1 != null && l2 != null){
            ListNode p1 = l1.next;
            ListNode p2 = l2.next;
            if(l1.val <= l2.val){
                cur.next = l1;
                l1 = p1;
            } else {
                cur.next = l2;
                l2 = p2;
            }
            cur = cur.next;
        }
        
        if(l1 == null && l2 != null)
            cur.next = l2;
        if(l1 != null && l2 == null)
            cur.next = l1;
        return Head.next;
        
    }
}

8. 复杂链表的复刻

原题链接
在这里插入图片描述
在这里插入图片描述

/**
 * Definition for singly-linked list with a random pointer.
 * struct ListNode {
 *     int val;
 *     ListNode *next, *random;
 *     ListNode(int x) : val(x), next(NULL), random(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *copyRandomList(ListNode *head) {
        for(auto p = head; p ; ) //遍历原链表
        { 
            auto np = new ListNode(p->val); //复刻节点
            auto next = p->next; //留存原链表当前节点p的下一个节点
            p->next = np;//将原链表当前节点p指向复刻节点
            np->next = next;//复刻节点np指向原链表当前节点的下一个节点
            p = next; //p指针后移
        }
        for (auto p = head; p; p = p->next->next)//对原链表random指针的复刻。
        {
            if (p->random)
                p->next->random = p->random->next;
        }
        auto dummy = new ListNode(-1); //虚拟头结点
        auto cur = dummy; //尾节点
        for (auto p = head; p; p = p->next) //将原链表和复刻链表拆分出来,并将原链表复原。
        {
            cur->next = p->next;
            cur = cur->next;
            p->next = p->next->next;
        }
        return dummy->next;
    }
};
/**
 * Definition for singly-linked list with a random pointer.
 * class ListNode {
 *     int val;
 *     ListNode next, random;
 *     ListNode(int x) { this.val = x; }
 * };
 */
class Solution {
    public ListNode copyRandomList(ListNode head) {
        if(head == null)
            return null;
        ListNode cur = head;
        
        while(cur != null){
            
            ListNode temp = new ListNode(cur.val);
            temp.next = cur.next;
            cur.next = temp;
            cur = cur.next.next;
        }
        
        
        
        cur = head;
        
        while(cur != null){
            
            ListNode temp = cur.next;
            if(cur.random != null){
                temp.random = cur.random.next;
            } else {
                temp.random = new ListNode(-1);
            }
            
            cur = cur.next.next;
        }
        
        // 创建一个头节点 便于返回节点
        
        ListNode H = new ListNode(0);
        H.next = head.next;
        cur = head;
        
        while(cur != null){
            ListNode temp = cur.next;
            cur.next = cur.next.next;
            if(temp.next != null){
                temp.next = temp.next.next;
            }
            cur = cur.next;
        }
                
        return H.next;
    }
}

9. 二叉搜索树与双向链表

原题链接
在这里插入图片描述
就在中序递归遍历的基础上改了一点点,用一个pre指针保存中序遍历的前一个结点。
因为是中序遍历,遍历顺序就是双线链表的建立顺序;
每一个结点访问时它的左子树肯定被访问过了,所以放心大胆的改它的left指针,不怕树断掉;
同理,pre指向的结点保存的数肯定小于当前结点,所以其左右子树肯定都访问过了,所以其right指针也可以直接改。

最后需要一直向左找到双向链表的头结点。

/**
 * 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:

    TreeNode* pre = NULL;

    TreeNode* convert(TreeNode* root) {
        dfs(root);
        while(root && root->left) root = root->left;
        return root;
    }
    void dfs(TreeNode* root){
        if(!root) return;
        dfs(root->left);

        root->left = pre;
        if(pre) pre->right = root;
        pre = root;

        dfs(root->right);
    }
};
class Solution {
    TreeNode first = null;
    TreeNode last = null;
    public TreeNode convert(TreeNode root) {
        helper(root);
        return first;
    }
    private void helper(TreeNode node) {
        if (node == null) {
            return;
        }
        helper(node.left);
        if (last == null) {
            first = node;
        } else {
            last.right = node;
            node.left = last;
        }
        last = node;
        helper(node.right);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/873541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一题——旋转数组的最小数字(II)

旋转数组的最小数字——II 题目链接 注&#xff1a;此题是昨天旋转数组的最小数字——I的拓展延伸&#xff0c;昨天题目数组的条件是不会存在重复元素&#xff0c;而本题数组的元素可以重复&#xff0c;因此建议先做前面一题&#xff0c;进行思考&#xff0c;这样求解这一题的…

python print单引号和双引号区别

python中单引号和双引号有什么区别 942次阅读 没有评论 单引号和双引号 在Python中我们都知道单引号和双引号都可以用来表示一个字符串&#xff0c;比如 str1 python str2 "python" str1和str2是没有任何区别的。但是如果遇到需要转义字符的情况&#xff0c;来…

面试热题(反转字符串中的单词)

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格…

Skeleton-Aware Networks for Deep Motion Retargeting

Skeleton-Aware Networks for Deep Motion Retargeting解析 摘要1. 简介2. Related Work2.1 运动重定向&#xff08;Motion Retargeting&#xff09;2.2 Neural Motion Processing 3. 概述&#xff08;Overview&#xff09;4. 骨骼感知深度运动处理4.1 运动表征4.2 骨架卷积4.3…

《论文阅读12》RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds

一、论文 研究领域&#xff1a;全监督3D语义分割&#xff08;室内&#xff0c;室外RGB&#xff0c;kitti&#xff09;论文&#xff1a;RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds CVPR 2020 牛津大学、中山大学、国防科技大学 论文链接论文gi…

pyqt5多线程(子线程执行将结果返回到主线程上,提示对话框)

pyqt5多线程&#xff08;子线程执行将结果返回到主线程上&#xff0c;提示对话框&#xff09; 1.为什么要多线程执行 在主线程ui界面点击登录后&#xff0c;加延时10s,&#xff08;模拟调用接口登录&#xff0c;假设耗时10s&#xff09;,ui主线程在等待请求返回结果&#xff…

Es、kibana安装教程-ES(二)

上篇文章介绍了ES负责数据存储&#xff0c;计算和搜索&#xff0c;他与传统数据库不同&#xff0c;是基于倒排索引来解决问题的。Kibana是es可视化工具。 分布式搜索ElasticSearch-ES&#xff08;一&#xff09; 一、ElasticSearch安装 官网下载地址&#xff1a;https://www…

Kotlin runBlocking launch多个协程读写mutableListOf时序

Kotlin runBlocking launch多个协程读写mutableListOf时序 import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlockingfun main(args: Array<String>) {var lists mutableListOf<String>()runBlocking {launch {r…

jsoup解析html之table表格

jsoup解析html之table表格 jsoup说明 一款Java 的HTML解析器 jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于jQuery的操作方法来取出和操作数据。 主要功能 从一…

Mac M2 Pro安装使用Cocoapods

Mac Pro M2安装使用Cocoapods 在新公司要做iOS开发&#xff0c;所以在新电脑上安装Cocoapods 在升级gem&#xff0c;sudo gem update --system&#xff0c;和安装cocoapods时都遇到如下的提示&#xff1a; ERROR: While executing gem ... (Errno::EPERM)Operation not per…

【MybatisPlus】LambdaQueryWrapper和QueryWapper的区别

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

input 设置type=“number“,鼠标悬停关闭提示语

一、问题 最近刚发现input 设置type"number"之后&#xff0c;鼠标悬停会出现提示语&#xff1a;请输入有效值。两个最接近的有效值分别为xx和xx。想要输入的值确实为number格式&#xff0c;又可以输入小数&#xff0c;不限制小数位&#xff0c;所以要把这讨厌的提示去…

最小路径和——力扣64

文章目录 题目描述动态规划题目描述 动态规划 class Solution {public:int minPathSum(vector<vector<int>>

WebAPIs 第四天

1.日期对象 2.节点操作 3.M端事件 4.JS插件 一.日期对象 实例化时间对象方法时间戳 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 1.1 实例化 ① 概念&#xff1a;在代码中发现了new关键字时&#xff0c;一般将这个操作称为实例化 …

Controller是线程安全吗?如何实现线程安全

测试是否是线程安全 RequestMapping("/test") RestController public class TestController {//1、定义num&#xff0c;判断不同线程访问的时候&#xff0c;num的返回结果是否一致private Integer num0;/*** 2、定义两个方法*/GetMapping("/count1")publi…

一个注解实现分布式锁

文章首发微信公众号《java知路》 分布式锁原理 分布式锁是一种用于在分布式系统中协调多个节点并保证数据一致性的机制。它的目的是在分布式环境下实现互斥访问共享资源&#xff0c;以防止多个节点同时对共享资源进行修改或读取&#xff0c;从而保证数据的正确性和一致性。 实…

单向-->不带头-->非循环链表(简称:单链表)

目录 一、链表的介绍 1.链表的概念 2.单链表的节点类型 3.单链表简图 二、单链表的增删查改 1.单链表的头插 2.单链表的尾插 3.单链表的头删 4.单链表的尾删 5.单链表pos位置之后插入一个节点 6.单链表删除pos位置后的一个节点 一、链表的介绍 1.链表的概念 链表是一…

如何搬运订单(1688)

目录 下载安装与运行 任务描述 搬运具体要求&#xff08;示例&#xff09; 订单导出操作过程 搜索指定范围的订单 选择要导出的订单数据 完整的导出动画演示 切换到另一个账号 B账号批量下单的要求 下单步骤 下单设置 为啥选加采购车而不是立即下单 为啥要选自动情…

Java-方法

在编程中&#xff0c;我们也可以将频繁使用的代码封装成"帖子"(方法)&#xff0c;需要时直接拿来链接 方法就是一个代码片段. 类似于 C 语言中的 “函数” 方法定义 修饰符 返回值类型 方法名称([参数类型 形参 …]){ 方法体代码; [return 返回值]; } 这里比得C语言…

关于视频人工智能/机器视觉创业商业模式的一些思考

今年开始了我的第二次创业&#xff0c;第一次创业大家看我以前的博客就知道了&#xff0c;做音视频流媒体相关技术的&#xff0c;现在公司也已经是安徽省专精特新中小企业了&#xff0c;还好是“中小企业”&#xff0c;如果直接是专精特新企业&#xff0c;我就可以不用来视频人…