链表高频题

news/2024/9/28 23:35:17/文章来源:https://www.cnblogs.com/sprinining/p/18438640

链表高频题

160. 相交链表

#include <vector>
#include <iostream>
#include <algorithm>struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA == nullptr || headB == nullptr) return nullptr;ListNode *a = headA;ListNode *b = headB;int diff = 0;while (a->next != nullptr) {a = a->next;diff++;}while (b->next != nullptr) {b = b->next;diff--;}// 根本就不重合if (a != b) return nullptr;// 较长的链表赋给 aif (diff > 0) {a = headA;b = headB;} else {a = headB;b = headA;}diff = abs(diff);// 较长的链表先走 diff 步while (diff-- != 0)a = a->next;// 距离尾节点距离相同时,同时出发while (a != b) {a = a->next;b = b->next;}return a;}
};

25. K 个一组翻转链表

#include <vector>
#include <iostream>
#include <algorithm>using namespace std;struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};class Solution {
public:ListNode *reverseList(ListNode *head, ListNode *tail) {ListNode *pre = tail->next, *cur = head, *next;ListNode *nextNode = tail->next;while (cur != nullptr && cur != nextNode) {next = cur->next;cur->next = pre;pre = cur;cur = next;}return pre;}ListNode *reverseKGroup(ListNode *head, int k) {// 虚拟头节点,接在链表最前面,使得第一段要反转的链表部分的处理和后面统一ListNode *dummyHead = new ListNode(0, head);ListNode *pre = dummyHead;ListNode *left = dummyHead;ListNode *right;// 后移次数int count;while (pre->next != nullptr) {// left、right 移到下一段要反转的链表的头部left = pre->next;right = left;// right 后移 k-1 个节点for (count = k - 1; count != 0 && right->next != nullptr; count--)right = right->next;// 链表元素总数小于 kif (count != 0) return dummyHead->next;// 把反转后的部分接到前面的链表上pre->next = reverseList(left, right);// 反转后 left 节点变成反转部分的尾节点,也就是下一段要反转的部分的上一个节点pre = left;}return dummyHead->next;}
};

138. 随机链表的复制

#include <vector>
#include <iostream>
#include <algorithm>using namespace std;class Node {
public:int val;Node *next;Node *random;Node(int _val) {val = _val;next = nullptr;random = nullptr;}
};class Solution {
public:Node *copyRandomList(Node *head) {if (head == nullptr) return nullptr;Node *pre = head;// 遍历原链表,在每个节点后面插入新节点while (pre != nullptr) {// 复制原节点的值Node *node = new Node(pre->val);// 接在原节点的后面node->next = pre->next;pre->next = node;pre = pre->next->next;}pre = head;// 遍历链表,复制 random 指针while (pre != nullptr) {if (pre->random != nullptr)pre->next->random = pre->random->next;pre = pre->next->next;}pre = head;Node *res = head->next;Node *cur = head->next;// 分离出复制出的链表while (cur != nullptr && cur->next != nullptr) {// 改回原链表节点的 next 指针pre->next = pre->next->next;pre = pre->next;// 新链表的节点从原链表中分离出来,串在一起cur->next = cur->next->next;cur = cur->next;}// 原链表尾节点的 next 指针pre->next = nullptr;return res;}
};

234. 回文链表

#include <vector>
#include <iostream>
#include <algorithm>using namespace std;struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};class Solution {
public:// 返回向上取整的中间节点// [1, 2, 3, 4] 返回 3ListNode *findMid(ListNode *head) {ListNode *slow = head;ListNode *fast = head;while (fast != nullptr && fast->next != nullptr) {fast = fast->next->next;slow = slow->next;}return slow;}// 原地反转ListNode *reverseList(ListNode *head) {ListNode *pre = nullptr;ListNode *cur = head;ListNode *next;while (cur != nullptr) {next = cur->next;cur->next = pre;pre = cur;cur = next;}return pre;}bool isPalindrome(ListNode *head) {ListNode *mid = findMid(head);mid = reverseList(mid);ListNode *p = head;ListNode *q = mid;while (q != nullptr) {if (p->val != q->val) return false;p = p->next;q = q->next;}return true;}
};

142. 环形链表 II

#include <vector>
#include <iostream>
#include <algorithm>using namespace std;struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(nullptr) {}
};class Solution {
public:ListNode *detectCycle(ListNode *head) {// 环外节点数 a,环内节点数 b// 快慢指针经过的节点个数关系: f = 2s// 相遇时: f = s + n*b -> s = n*b, f = 2*n*b// 走到入口节点经过的节点个数 k = a + n*b, 先前进 a 步到入口节点, 然后在环里转圈// f = 0, s = n*b -> f = a, s = a + n*b 相遇在入口节点ListNode *slow = head, *fast = head;while (fast != nullptr && fast->next != nullptr) {slow = slow->next;fast = fast->next->next;// 首次相遇时,slow 已经跑了 b 步,只需跑 a 步就能到达入口// fast 返回开头 head 节点,也只需跑 a 步就能到达入口// 此时 a 是几并不知道,但是可以确定的是,slow 和fast 都在跑 a 步就会在入口相遇if (slow == fast) {fast = head;// 此时 f = 0, s = 1*bwhile (slow != fast) {slow = slow->next;fast = fast->next;}// 结束时 f = a, s = a + 1*breturn slow;}}return nullptr;}
};

148. 排序链表

#include <vector>
#include <iostream>
#include <algorithm>using namespace std;struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};class Solution {
public:// 链表归并ListNode *merge(ListNode *l1, ListNode *l2) {if (l1 == nullptr || l2 == nullptr) return l1 == nullptr ? l2 : l1;ListNode *dummyHead = new ListNode();ListNode *pre = dummyHead;while (l1 != nullptr && l2 != nullptr) {if (l1->val < l2->val) {pre->next = l1;l1 = l1->next;} else {pre->next = l2;l2 = l2->next;}pre = pre->next;}if (l1 != nullptr) pre->next = l1;if (l2 != nullptr) pre->next = l2;return dummyHead->next;}// 时间复杂度 O(n * logn),额外空间复杂度 O(1),稳定ListNode *sortList(ListNode *head) {// 统计链表长int len = 0;ListNode *temp = head;while (temp != nullptr) {len++;temp = temp->next;}ListNode *dummyHead = new ListNode();dummyHead->next = head;// 步长每次乘二for (int gap = 1; gap < len; gap <<= 1) {ListNode *pre = dummyHead;ListNode *cur = dummyHead->next;// 每次从一组元素的首个元素节点开始(两个子链表为一组)while (cur != nullptr) {// 长度为 gap 的子链表 l1ListNode *l1 = cur;int i = 1;while (i < gap && cur->next != nullptr) {cur = cur->next;i++;}// 子链表 l2ListNode *l2 = cur->next;// 把 l2 从 l1 后面断开cur->next = nullptr;// 找到子链表 l2 的末尾,l2 可能是最后一个子链表并且长度小于等于 gap// l2 后面可能还有cur = l2;i = 1;while (i < gap && cur != nullptr && cur->next != nullptr) {cur = cur->next;i++;}ListNode *next = nullptr;// l2 后面还有节点时if (cur != nullptr) {// 下一组的起点(两个子链表为一组)next = cur->next;// 断开,l2变成完成的一条链表cur->next = nullptr;}// 把这组的两个子链表合并pre->next = merge(l1, l2);// pre 移到合并后的最后一个节点,等待接上下一组合并后的首个节点while (pre->next != nullptr)pre = pre->next;// 进入下一组的归并cur = next;}}return dummyHead->next;}
};

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

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

相关文章

手机为什么能够打电话上网,一文带你搞懂其原理

我们的手机为什么能够打电话能够上网,这个问题相信 很多人都思考过,为什么在千里之外,他可以借到我拨出的电话,我说话的声音可以清晰地传到他的耳中,在这小小的手机里,我们可以浏览天下所有的资讯。这究竟是怎么样做到的? 这其实是得益于蜂窝移动通信网络的发展。今天我…

[友链] 挚友之链

Mystery0の小站https://blog.mystery0.vip/本文作者:千千寰宇本文链接:https://www.cnblogs.com/johnnyzen关于博文:评论和私信会在第一时间回复,或直接私信我。版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!日常交流:大数据与软件开…

AI Agent应用出路到底在哪?

1 Agent/Function Call 的定义 Overview of a LLM-powered autonomous agent system:Agent学会调用外部应用程序接口,以获取模型权重中缺失的额外信息(预训练后通常难以更改),包括当前信息、代码执行能力、专有信息源访问权限等。 2 从去年到现在有什么进展? Not a resea…

极客大挑战2023-pwn-nc_pwntools WriteUp

主要考查点 Pwntools工具的基本使用方法 解题思路 1.nc 连接题目,得到提示:根据题目,要求发送一个100长度的字符串,而且末尾需要为Syclover bA*92 + bSyclover 2.发送第一个请求后进入第二步要求短时间内计算一个复杂算式,自己算是肯定不可能的,所以pwntools的recv来接收…

pbootcms统计代码标签(如何安装百度统计代码)

要在 PbootCMS 中安装百度统计代码或其他第三方统计代码,可以按照以下步骤操作: 1. 后台安装统计代码登录后台:访问后台地址:你的域名/admin.php。 账号:admin,密码:admin。进入站点信息设置:在后台左侧菜单中选择“基础内容” -> “站点信息”。粘贴统计代码:在“…

PbootCMS后台访问地址及默认帐号密码

如果你在使用PbootCMS时遇到关于后台默认账号密码的问题,以下是一些关键信息: PbootCMS 后台默认访问路径访问路径:你的域名/admin.php将“你的域名”替换为实际的网址。后台初始账号密码初始账号:admin 初始密码:admin示例 假设你的域名为 example.com,则后台访问路径为…

docker 创建私有仓库,并且设置用户名和密码

1. 拉取仓库 docker pull registry2. 安装密码生成工具 sudo apt-get install apache2-utils3. 生成用户名和密码 htpasswd -Bc /etc/docker/registry/passwords dzq4. 启动仓库docker run -d -p 5000:5000 --restart=always --name registry \-e REGISTRY_AUTH=htpasswd…

PbootCMS简单安装教程 – pbootcms基本使用教程

为了帮助用户顺利安装并使用PbootCMS系统,以下是详细的安装步骤和注意事项: 1. 环境要求PHP版本:PbootCMS系统默认采用SQLite数据库,需要PHP 5.4及以上版本,最新系统需要PHP 7.0及以上版本。 服务器环境:确保服务器环境正确配置,使用PHP环境。2. 安装前的准备环境配置:…

pbootcms目录结构解释说明及权限设置

为了确保PbootCMS能够正常运行,需要对一些关键目录设置正确的权限。以下是具体的目录权限设置说明: 1. 数据库目录 (data) 可写路径:/data 权限:755 或 777 命令:bashchmod 755 /path/to/pbootcms/data2. 运行时目录 (runtime) 及子目录可写路径:/runtime 权限:755 或 7…

pbootcms二次开发必须要了解的后台目录结构

下面是PbootCMS后台目录结构的整理表格,方便二次开发人员参考:目录 描述apps 应用目录 admin 后台应用 api API接口应用 common 公共目录 home 前台应用config 配置目录 config.php 系统配置文件 database.php 数据库配置文件 route.php 自定义路由配置…

pbootcms模板 后台升级程序后导致网站打不开 Parse error: syntax error, unexpec

当你在升级PbootCMS模板后台后遇到网站打不开的问题,并且出现如下错误: Parse error: syntax error, unexpected :, expecting { in /www/wwwroot/****/core/function/helper.php on line 745这通常是因为PHP版本不兼容导致的。PbootCMS 3.2版本要求PHP 7及以上版本。以下是具…

小模型(SLM)的效率、性能和潜力

关于小语言模型 小语言模型(slm)是为在桌面、智能手机和可穿戴设备上进行资源高效部署而设计的。 其目标是使先进的机器智能能够为每个人所使用和负担得起,就像人类认知的普遍性一样。 小语言模型(slm)已经广泛集成到商业设备中。例如,最新的谷歌和三星智能手机内置了大型语言…