链表系列题目Leetcode
时间:2021-07-20
本文章向大家介绍链表系列题目Leetcode,主要包括链表系列题目Leetcode使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.题目:203. 移除链表元素
链接:https://leetcode-cn.com/problems/remove-linked-list-elements/
方法1:递归:递归函数定义为当前节点所指向的链表中无node.val==v的情况
class Solution {
public:
ListNode* removeElements(ListNode* h, int v) {
if(h==nullptr)return nullptr;
h->next=removeElements(h->next,v);
if(h->val==v)return h->next;
return h;
}
};
方法2:迭代:定义一个头结点固定指向这个链表,然后再通过一个指针遍历链表删除node.val==v的情况
class Solution {
public:
ListNode* removeElements(ListNode* h, int v) {
if(h==nullptr)return nullptr;
ListNode * head= new ListNode(0,h);//初始化 head-next=h
ListNode * ans=head;
while(ans->next!=nullptr){
if(ans->next->val==v){
ans->next=ans->next->next;
}
else {
ans=ans->next;
}
}
return head->next;
}
};
2.合并两个有序链表
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/
思路1:递归:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==nullptr)return l2;
if(l2==nullptr)return l1;
if(l1->val<l2->val) {
l1->next=mergeTwoLists(l1->next,l2);
return l1;
}
else {
l2->next=mergeTwoLists(l1,l2->next);
return l2;
}
}
};
思路2:迭代:定义一个头结点,然后进行类似双指针的操作迭代即可
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *head=new ListNode(0);
ListNode * ans =head;
while(l1!=nullptr&&l2!=nullptr){
if(l1->val<l2->val){
ans->next=l1;
l1=l1->next;
// l2=l2->next;
ans=ans->next;
}
else {
ans->next=l2;
// l1=l1->next;
l2=l2->next;
ans=ans->next;
}
}
l1==nullptr ? ans->next=l2:ans->next=l1;
return head->next;
}
};
- 环形链表
链接:https://leetcode-cn.com/problems/linked-list-cycle/
思路1:哈希表,unordered_map或者unorderde_set 记录走过的点
class Solution {
public:
bool hasCycle(ListNode *head) {
unordered_set<ListNode*> m;
while(head!=nullptr){
if(m.count(head))return true;
m.insert(head);
head=head->next;
}
return false;
}
};
思路2:快慢指针,快指针一次移动两个节点,慢指针一次移动一个,当两个指针在同一个环内时必然会碰撞。
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode * a=head, *b =head;
while(a!=nullptr&&b!=nullptr){
a=a->next;
if(a!=nullptr)
a=a->next;
b=b->next;
if(a==b&&a!=nullptr)return true;
}
return false;
}
};
原文地址:https://www.cnblogs.com/abestxun/p/15036548.html
- 无锁编程(一) - Double-checked Locking
- 无锁编程(二) - 原子操作
- 我所理解的Remoting(3):创建CAO Service Factory使接口和实现相互分离
- 无锁编程(三) - 忙等待
- Enterprise Library深入解析与灵活应用(9):个人觉得比较严重的关于CachingCallHandler的Bug
- 无锁编程(四) - CAS与ABA问题
- Linux Kernel CMPXCHG函数分析
- 无锁编程(五) - RCU(Read-Copy-Update)
- 无锁编程(六) - seqlock(顺序锁)
- 无锁编程(七) - 实战
- zookeeper的python客户端安装
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[上篇]
- 震撼:1分钟带你看完IC0的爆炸视频
- 事件(Event),绝大多数内存泄漏(Memory Leak)的元凶[下篇] (提供Source Code下载)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python threading.current_thread().name和.getName()有什么区别
- Golang是如何操作excel的?
- Typecho配置多国语支持,检查客户端语言自动切换翻译
- NgModule imports定义的运行时数据结构
- 用Windows电脑训练深度学习模型?超详细配置教程来了
- Angular No provider for EffectsRootModule错误消息
- Leetcode No.15 三数之和
- 正则表达式介绍与使用
- Angular StoreFeatureModule
- Angular Component之间的事件通知机制
- 如何将你的Python项目全面自动化?
- 正则表达式介绍与使用
- Angular ERROR NullInjectorError: R3InjectorError(AppModule)的错误分析
- 2.4-Air302(NB-IOT)-基础外设-延时,定时器
- Shell正则表达式一览表