代码随想录算法训练营Day.4 | 两两交换链表中的节点 删除链表的倒数第 N 个结点 链表相交 环形链表Ⅱ

ops/2025/2/1 15:52:38/

前段时间比较忙,去长沙参加比赛用了两天,然后准备组会两天,累了累了,这就速度补

24.两两交换链表中的节点

虽然是middle但是就是对链表的一个理解,两两交换需要记录三个节点才可以完成,同时需要一个虚拟头节点dumyNode。代码如下:

class Solution {
public:ListNode* swapPairs(ListNode* head) {if(!head) return head;ListNode* dummyNode = new ListNode(-1);dummyNode->next = head;ListNode* preNode = dummyNode;ListNode* midNode = head;ListNode* nextNode = midNode->next? midNode->next:nullptr;while(nextNode != nullptr){preNode->next = nextNode;midNode->next = nextNode->next;nextNode->next = midNode;// 更新preNode = midNode;midNode = preNode->next;nextNode = midNode? midNode->next:nullptr;}return dummyNode->next;}
};

19.删除链表的倒数第 N 个结点

很明显,在我无法后退的情况下,要得到第N个节点,就需要快慢指针间隔N,同时还需要考虑到删除头节点的情况,所以要引入虚拟头节点。代码如下:

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {if(head->next == nullptr) return nullptr;ListNode* dummyNode = new ListNode(-1);dummyNode->next = head;ListNode* slowNode = dummyNode;ListNode* fastNode = dummyNode;int length = 0;while(fastNode != nullptr){fastNode = fastNode->next;if(length != n+1)length ++;elseslowNode = slowNode->next;}ListNode* aimNode = slowNode->next;if(n == 1) slowNode->next = nullptr;else{slowNode->next = aimNode->next;aimNode->next = nullptr;}return dummyNode->next;}
};

面试题02.07.链表相交

我的思考是,先找到两个链表长度差,然后两侧同步前进,第一个相同的节点就是初始交点,但是代码实现的比较烂。代码如下:

class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if(!headA || !headB) return nullptr;// find tailListNode* findA = headA;ListNode* findB = headB;if(findA == findB) return findA;int skipA{0}, skipB{0};bool isFind = false;while(findA->next != nullptr || findB->next != nullptr){if(findA->next != nullptr) findA = findA->next;else  skipA ++;if(findB->next != nullptr) findB = findB->next;else  skipB ++;if(findA == findB) {isFind = true; break;}}if(!isFind) return nullptr;findA = headA;findB = headB;if(skipA > 0){while(skipA > 0){findB = findB->next;skipA --;}}else{while(skipB > 0){findA = findA->next;skipB --;}}while(findA != nullptr || findB != nullptr){if(findA == findB) return findA;findA = findA->next;findB = findB->next;}return findA;}
};

看了下随想录的代码,结果想法和我一样,有点离谱的就是LeetCode另一个方法是哈希集合,我属实是被限制住了,这道题的easy方法就在这里,代码如下:

class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {unordered_set<ListNode *> visited;ListNode *temp = headA;while (temp != nullptr) {visited.insert(temp);temp = temp->next;}temp = headB;while (temp != nullptr) {if (visited.count(temp)) {return temp;}temp = temp->next;}return nullptr;}
};

142.环形链表

待补充


http://www.ppmy.cn/ops/131537.html

相关文章

Netty ByteBuf 分配 | 池化复用 、直接内存

Netty ByteBuf 分配 本文主要内容关于 ByteBuf 分配介绍&#xff0c;为了更好的理解本文&#xff0c;我们可以带着几个问题思考 在IO密集型业务场景下&#xff0c;可能涉及大量ByteBuf分配&#xff0c;这时我们需 要考虑会不会产生OOM会不会出现频繁GC会不会内存泄露 根据上…

【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

C# 图片工具类,缩略图、加水印、调整光暗和灰度、翻转图片等...

ImageClass.cs类可以帮助通过代码对图片进行如下处理&#xff1a;缩略图、加图片水印、文字水印、调整光暗、反色处理、浮雕处理、拉伸图片、滤色处理、左右翻转、上下翻转、压缩图片、图片灰度化、转换为黑白图片、获取图片中的各帧数。 图片工具类中功能函数示例&#xff1a…

并发编程的基础:深入理解内存屏障(Memory Barriers)

内存屏障是一种基础语言&#xff0c;在不同的计算机架构下有不同的实现细节。本文主要在x86_64处理器下&#xff0c;通过Linux及其内核代码来分析和使用内存屏障 对大多数应用层开发者来说&#xff0c;“内存屏障”&#xff08;memory Barrier&#xff09;是一种陌生&#xff…

恋爱脑学Rust之dyn关键字的作用

在 Rust 语言中&#xff0c;dyn 关键字允许我们在使用特征时创建“动态派发”——即通过一个统一的接口操作多种类型的具体实现。可以把它理解成一种“浪漫的妥协”&#xff1a;当我们不知道未来会爱上谁&#xff0c;只知道对方一定具有某种特征时&#xff0c;dyn 就像一个协议…

《今日制造与升级》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《今日制造与升级》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《今日制造与升级》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;中国机械工业联合会 …

Pr 视频效果:过渡

效果面板/视频效果/过渡 Video Effects/Transition Adobe Premiere Pro 的视频效果中&#xff0c;过渡 Transition效果组用于创建单个剪辑内过渡效果的一组视频效果。这些效果可以增强视频的视觉连贯性&#xff0c;添加创意性的视觉转换&#xff0c;为观众提供流畅的观看体验。…

【AI视频换脸整合包及教程】AI换脸新星:Rope——让换脸变得如此简单

在数字技术迅猛发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;的应用已经渗透到了我们生活的方方面面&#xff0c;从日常的语音助手到复杂的图像处理&#xff0c;无不体现着AI技术的魅力。特别是在娱乐和创意领域&#xff0c;AI技术更是展现出了惊人的潜力。其中&a…