8.13 刷题记录(4道题)

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.hqwc.cn/news/65389.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CI/CD】Git Flow 分支模型

Git Flow 分支模型 1.前言 Git Flow 模型&#xff08;本文所阐述的分支模型&#xff09;构思于 2010 年&#xff0c;也就是 Git 诞生后不久&#xff0c;距今已有 10 多年。在这 10 多年中&#xff0c;Git Flow 在许多软件团队中大受欢迎。 在这 10 多年里&#xff0c;Git 本身…

11款UML/SysML建模工具更新(2023.7)Papyrus、UModel……

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 最近一段时间更新的工具有&#xff1a; 工具最新版本&#xff1a;drawio-desktop 21.6.5 更新时间&#xff1a;2023年7月22日 工具简介 开源绘图工具&#xff0c;用Electron编写&#xff0c;…

什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?

文章目录 前言我们为什么要使用线程而不是进程来实现并发编程什么是线程进程和线程的区别如何使用Java实现多线程创建线程1.创建一个继承 Thread 类的线程类2.实现 Runnable 接口匿名内部类方式实现 Runnable 接口lambda 表达式实现 Runnable 接口 Thread 类的常见构造方法Thre…

2. 获取自己CSDN文章列表并按质量分由小到大排序(文章质量分、博客质量分、博文质量分)(阿里云API认证)

文章目录 写在前面步骤打开CSDN质量分页面粘贴查询文章url按F12打开调试工具&#xff0c;点击Network&#xff0c;点击清空按钮点击查询是调了这个接口https://bizapi.csdn.net/trends/api/v1/get-article-score用postman测试调用这个接口&#xff08;不行&#xff0c;认证不通…

阿里云免费服务器领取入口_限制条件_申请指南

阿里云免费服务器领取&#xff0c;个人和企业用户均可以申请&#xff0c;个人免费服务器1核2GB 每月750小时&#xff0c;企业u1服务器2核8GB免费使用3个月&#xff0c;阿里云百科分享阿里云免费服务器申请入口、个人和企业免费配置、申请资格条件及云服务器免费使用时长&#x…

SpringBoot 简单入门部署

1. 环境要求 Java 8 (配置环境变量)Maven 3.3idea 2019.1.2 及以上 1.1 maven 配置 <mirrors><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/n…

display 属性有哪些值,分别表示什么意思

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ display 属性是什么&#xff1f;⭐ display 属性有哪些值&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

4. 软件开发的环境搭建

目录 1. 搭建环境 1.1 检查 JDK 1.2 检查 MySQL 数据库 1.3 检查 Maven 1.4 检查 GITEEGIT 1.5 安装插件 1.5.1 安装 Spring Boot Helper 1.5.2 安装 lombok 1.6 创建仓库 1.6.1 登录 GITEE 创建仓库并复制仓库地址 1.6.2 克隆到本地 1.7 创建工程 1.7.1 设置编码…

ubuntu下gif动态图片的制作

Gif图片比视频小, 比静态JPG图片形象生动, 更适用于产品展示和步骤演示等。各种各样的gif动图为大家交流提供很大的乐趣. 这里简单介绍ubuntu系统下gif图的制作。 一、工具安装: kazam和ffmpeg kazam是linux下的一款简单但是功能强大的屏幕录制工具. 它可录制声音并选择全屏录…

Benchmarking Augmentation Methods for Learning Robust Navigation Agents 论文阅读

论文信息 题目&#xff1a;Benchmarking Augmentation Methods for Learning Robust Navigation Agents: the Winning Entry of the 2021 iGibson Challenge 作者&#xff1a;Naoki Yokoyama, Qian Luo 来源&#xff1a;arXiv 时间&#xff1a;2022 Abstract 深度强化学习和…

redis设置database 不生效剖析

设置database 不生效剖析 前言配置加载类问题commons-pool 对象池 主页传送门&#xff1a;&#x1f4c0; 传送 前言 事情是这样的 今天在拉取了同事的代码做redis缓存设置的时候&#xff0c;发现即使已经设置了database, 但是存数据的时候还是用的默认0数据库。这引起了我的好…

WebSocket与消息推送

B/S结构的软件项目中有时客户端需要实时的获得服务器消息&#xff0c;但默认HTTP协议只支持请求响应模式&#xff0c;这样做可以简化Web服务器&#xff0c;减少服务器的负担&#xff0c;加快响应速度&#xff0c;因为服务器不需要与客户端长时间建立一个通信链接&#xff0c;但…