[模板总结] - 单向链表LinkedList操作

devtools/2024/11/18 19:05:09/

题目汇总

Leetcode 21, 82, 160, 206, 237, 268

Leetcode 21. 合并两个有序链表

归并排序的思路,创建一个哨兵节点从两个链表中按大小插入即可。

/*** 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* mergeTwoLists(ListNode* list1, ListNode* list2) {ListNode* dum = new ListNode(-1);ListNode* curr = dum;while(list1 && list2) {if (list1->val < list2->val) {curr->next = list1;list1 = list1->next;} else {curr->next = list2;list2 = list2->next;}curr = curr->next;}while(list1) {curr->next = list1;curr = curr->next;list1 = list1->next;}while(list2) {curr->next = list2;curr = curr->next;list2 = list2->next;}return dum->next;}
};

时间复杂度: O ( N + M ) \mathcal{O}(N+M) O(N+M)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode.82 Linkedlist中删除所有重复片段

这道题目要求是删除所有重复的片段,而不仅仅是去重,基本思路就是线性扫描,如果扫描的片段有重复也就是长度大于1那么就跳过这部分,接着找下面,如果查看部分长度==1那么就将该元素加入结果。在循环时维持一个循环不变量

建立一个pred节点,这个节点在每一个循环开始时一定指向的是当前最新的不重复节点位置

class Solution {
public:ListNode* deleteDuplicates(ListNode* head) {ListNode* dum = new ListNode(-1);dum->next = head;auto pred = dum; // 哨兵节点作为第一个不会重复的节点while(pred->next) {/*循环不变量 ->pred前驱节点时刻定位*/auto p1 = pred->next;while(p1 && pred->next->val==p1->val) {p1 = p1->next;}//确定是不是要更新pred到新的不重复if (pred->next->next==p1) pred = pred->next; //遇到新的不重复节点,更新pred的位置else pred->next = p1; // 跳过当前重复片段,pred指向下一个片段开始位置,但这里不更新pred位置因为当前p1位置可能重复,需要下一个循环进行检测.}return dum->next;}
};

时间复杂度: O ( N ) \mathcal{O}(N) O(N)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode 206. 反转一个单向链表

要求in-place反转,基本思路可以进行递归反转,在每一次递归中把下一层返回节点的next指向当前节点即可。
第二种方法是利用迭代的方式,每一次循环中,保存当前节点的下一个节点nxt,并把当前节点next连接前一个节点prev,然后更新prev为当前节点,然后继续遍历。

//递归解法
class Solution {
public:ListNode* ans = new ListNode(-1);ListNode* reverseList(ListNode* head) {dfs(head);return ans->next;}ListNode* dfs(ListNode* head) {if(!head || !head->next) {//保存反转头节点ans->next = head;return head;} ListNode* res = dfs(head->next);//反转当前节点res->next = head;//断开当前节点与next节点连接res->next->next = nullptr;//返回当前节点return res->next;}
};//迭代解法
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* prev = NULL;while(head) {ListNode* curr = head;head = head->next;curr->next = prev;prev = curr;}return prev;}
};

时间复杂度:递归、迭代都是 O ( N ) \mathcal{O}(N) O(N)
空间复杂度:递归: O ( N ) \mathcal{O}(N) O(N) 栈的深度。迭代: O ( 1 ) \mathcal{O}(1) O(1)


http://www.ppmy.cn/devtools/135017.html

相关文章

【机器学习】机器学习中用到的高等数学知识-4.数值分析 (Numerical Analysis)

优化方法&#xff1a;用于寻找函数的极值&#xff08;如牛顿法、随机梯度下降&#xff09;。插值和拟合&#xff1a;用于处理数据点之间的关系&#xff0c;生成模型。 数值分析&#xff08;Numerical Analysis&#xff09;是数学的一个分支&#xff0c;专注于开发用于数值近似…

一文简单了解Android中的input流程

在 Android 中&#xff0c;输入事件&#xff08;例如触摸、按键&#xff09;从硬件传递到应用程序并最终由应用层消费。整个过程涉及多个系统层次&#xff0c;包括硬件层、Linux 内核、Native 层、Framework 层和应用层。我们将深入解析这一流程&#xff0c;并结合代码逐步了解…

开源科学工程技术软件介绍 – EDA工具KLayout

link 今天向各位知友介绍的 KLayout是一款由德国团队开发的开源EDA工具。 KLayout是使用C开发的&#xff0c;用户界面基于Qt。它支持Windows、MacOS和Linux操作系统。安装程序可以从下面的网址下载&#xff1a; https://www.klayout.de/build.html KLayout图形用户界面&…

css实现斜条纹背景

最近有个模块需求采用斜条纹背景 做标头背景 记录下实现代码 <template><div class"striped-background"><span>货种</span><span>企业数</span><span>企业数</span><span>客户数</span></div> …

Chrome 浏览器开启打印模式

打开开发者工具ctrl shift p输入print 找到 Emulate CSS print media type

Git 搭建远程仓库、在 IDEA 工具中的配置和使用

Git的概念、安装、操作与分支管理和图形化界面TortoiseGit&#xff08;小乌龟 &#xff09;的安装与使用-CSDN博客 目录 一、远程仓库 1&#xff09;在github上创建仓库 2&#xff09;在gitee上创建项目 3&#xff09;如何将远程的项目clone 到本地 4&#xff09;公司自己…

28-一些常见的内存问题

诊断内存状况 ● 查看各个节点的内存状况 GET _cat/nodes?vGET _nodes/stats/indices?prettyGET _cat/nodesv&hname,queryCacheMemory,queryCacheEvictions,requestCacheMemory,requestCacheHitCount,request_cache.miss_countGET _cat/nodeshname,port,segments.memor…

抽象java入门1.5.3.1——类的进阶

前言&#xff1a;在研究神技代码Hello word的时候&#xff0c;发现了一个重大公式bug&#xff0c;在代码溯源中&#xff0c;我发现了一个奇怪的东西&#xff0c;就是OUT不是类中类&#xff08;不是常规类的写法&#xff09; 内容总结&#xff1a; 代码运行的顺序复习 正片开始…