首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

代码随想录Day4

编程知识
2024年08月04日 20:04

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

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100


正解(模拟)

整个交换过程:
步骤

上代码(●'◡'●)
/**
 * Definition for singly-linked list.
 * 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* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
        dummyHead->next = head; // 将虚拟头结点指向head,这样方便后面做删除操作
        ListNode* cur = dummyHead;
        while(cur->next != nullptr && cur->next->next != nullptr) {
            ListNode* pre = cur->next; // 记录临时节点
            ListNode* nex = cur->next->next->next; // 记录临时节点

            cur->next = cur->next->next;    // 步骤一
            cur->next->next = pre;          // 步骤二
            cur->next->next->next = nex;   // 步骤三

            cur = cur->next->next; // cur移动两位,准备下一轮交换
        }
        ListNode* result = dummyHead->next;
        delete dummyHead;
        return result;
    }
};

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

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:


输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

提示:

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

进阶:你能尝试使用一趟扫描实现吗?


力扣给的是一个单向链表,所以只能从前往后找;
但题目要求删除倒数第N个元素,所以得另想办法;

正解(双指针)

定义f,s,两个指针,f指针先走N步,然后f,s,一起移动直至f移动到链表末尾;
这时,s指向的就是倒数第N个元素;
思路很简单,写起来。。。也很简单 😃

上代码(●'◡'●)
/**
 * Definition for singly-linked list.
 * 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* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* s = dummyHead;
        ListNode* f = dummyHead;
        while(n-- && f != NULL) {
            f = f->next;
        }
        f = f->next;
        while (f != NULL) {
            f = f->next;
            s = s->next;
        }
        s->next = s->next->next; 
        return dummyHead->next;
    }
};

这样就实现了题目所要求的用一趟扫描完成。

面试题 02.07. 链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

示例 1:
示例1

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

示例 2:
示例2

输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例 3:
示例

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

提示:

listA 中节点数目为 m
listB 中节点数目为 n
0 <= m, n <= 3 * 104
1 <= Node.val <= 105
0 <= skipA <= m
0 <= skipB <= n
如果 listA 和 listB 没有交点,intersectVal 为 0
如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]

进阶:你能否设计一个时间复杂度 O(n) 、仅用 O(1) 内存的解决方案?


注意:结点的值相等不代表就是同一个节点
这也就是为什么示例1中相交的点不是1而是8了;

正解(双指针)

定义两个指针cur1,cur2,分别遍历A和B,求出长度;
让cur1指向较长的一个,再将cur1的节点个数从头删除直到与cur2相等;
这时,同时遍历cur1、cur2,当\(cur1_i==cur2_i\)时,返回\(cur1_i\)

上代码(●'◡'●)
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != NULL) {
            lenA++;
            curA = curA->next;
        }
        while (curB != NULL) {
            lenB++;
            curB = curB->next;
        }
        curA = headA;
        curB = headB;
        if (lenB > lenA) {
            swap (lenA, lenB);
            swap (curA, curB);
        }
        int gap = lenA - lenB;
        while (gap--) {
            curA = curA->next;
        }
        while (curA != NULL) {
            if (curA == curB) {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return NULL;
    }
};

这样就实现了题目要求的:
·时间复杂度\(O(n)\)
·空间复杂度\(O(1)\)

写博不易,请大佬点赞支持一下8~

From:https://www.cnblogs.com/Murder-sans/p/18341228/dmsxl_Day4
本文地址: http://www.shuzixingkong.net/article/776
0评论
提交 加载更多评论
其他文章 Jenkins API用户认证方式
1、概述 Jenkins的API可以通过用户名+密码或者用户名+Token的方式来进行认证,这篇文章以具体示例来说明具体的使用方式。 2、Jenkins环境 本文示例基于Jenkins 2.452.3版本进行演示,详细的环境构建可参考《Centos7下安装配置最新版本Jenkins(2.452.3)
Jenkins API用户认证方式 Jenkins API用户认证方式 Jenkins API用户认证方式
三.mysql问答合集
目录三.MySQL3.1 关系型和非关系型数据库的区别关系型数据库非关系型数据库3.2 登录数据库的方式,如何远程登录3.3 MySQL的服务结构,当客户端发起请求后,处理过程3.4 如何设置或者重置MySQL密码3.5 DDL,DML,DQL,DCL等SQL语句的写法DDL数据定义语句DCL数据控
三.mysql问答合集 三.mysql问答合集 三.mysql问答合集
使用python对Excel表格某个区域保存为图片
实际工作中,我们经常会把表格某个区域(如:A1:F5)或某个图形保存为图片,如何用python自动做到这一点?不知屏幕前的小伙伴有没有遇到过类似的需求,此刻脑海里有木有一丢丢思路。 python操作excel的第三方库有很多,个个都有各自的绝招和擅长的应用场景,简单罗列一下: pyexcel:pye
使用python对Excel表格某个区域保存为图片 使用python对Excel表格某个区域保存为图片
使用 C# 和 ONNX 來玩转Phi-3 SLM
LLM 席卷世界刷新 AI 的认知之后,由于 LLM 需要的硬件要求实在太高,很难在普通设备上运行,因此 SLM 逐漸受到重視,Phi-3 SLM 是由 Microsoft 所开发的模型,可以在你的电脑、手机等设备来运行,小型语言模型 (SLM) 和 ONNX 的结合改变了 AI 互操作性的游戏规则
使用 C# 和 ONNX 來玩转Phi-3 SLM 使用 C# 和 ONNX 來玩转Phi-3 SLM
使用django-treebeard实现树类型存储与编辑
前言 其实之前做很多项目都有遇到跟树相关的功能,以前都是自己实现的,然后前端很多UI组件库都有Tree组件,套上去就可以用。 不过既然用 Django 了,还是得充分发挥一下生态的优势,但是我找了半天,也就这个 treebeard 能用,其他要不停更了要不就功能很拉,没有可视化编辑树的功能。 难道D
使用django-treebeard实现树类型存储与编辑
全双工网卡在实际工作中上下行的网速速率是否一致?千兆网卡的同时上下行速率上限是否一样,网卡速率是上下行之和还是分别等于上下行速率
一直有个问题,就是理论上全双工网卡在运行时上下行的上限速率应该是一致的,但是实际网卡的标识的最高速率是否是指上下行速率之和还是和上下行速率一样。 为了解决这个问题,于是拿了两台台式机,分别装有千兆网卡(全双工),并使用六类线网线,两台主机同时向对方拷贝文件,效果如下: 结论: 全双工的网卡,其上下行
全双工网卡在实际工作中上下行的网速速率是否一致?千兆网卡的同时上下行速率上限是否一样,网卡速率是上下行之和还是分别等于上下行速率 全双工网卡在实际工作中上下行的网速速率是否一致?千兆网卡的同时上下行速率上限是否一样,网卡速率是上下行之和还是分别等于上下行速率
程序员副业探索之电商
在腾讯广告工作期间,我主要负责小程序电商与广告业务,见证了互联网电商行业的剧变,特别是众多电商公司纷纷拥抱私域流量,直播带货成为新风尚,广告投入也在持续增加。通过这些经历,我积累了不少关于互联网电商的经验,并萌生了尝试电商副业的想法。 在小红书上,女装博主们凭借独特的穿搭分享吸引了大量粉丝,“种草”
程序员副业探索之电商 程序员副业探索之电商 程序员副业探索之电商
英语.Net多语言开发中的问题
问题与现象 多语言开发是一件成本很高的事情。 很多公司会退而求其次选择只开发英文版本的软件分发到不同国家,但这里仍存在不同问题。 我们就遇到了这样的问题,参考下面的代码。 CultureInfo&#160;culture;double&#160;number&#160;=1.5; culture&#