20200909:链表类题目集合下
链表类题目集合下
- 题目
- 思路与算法
- 代码实现
- 写在最后
题目
1.138. 复制带随机指针的链表
2.21. 合并两个有序链表
3.23. 合并K个升序链表
思路与算法
- 返回深拷贝这个题目的意思读清楚就好了,要去找确定那个random指针到底指向了哪个节点。这是关键。用map来映射比较清晰,附上cpp和java两种语言的代码题解
- 合并链表的题目思路大致相同,对21来讲,合并两个链表,两种方法,无非是使用dummy_head这类方法或者是使用递归来实现。具体见代码,对23来讲,可以使用排序的方法,排序的依据为val的大小,先将其排好序,再进行连接即可。
代码实现
1.138. 复制带随机指针的链表
C++
/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/class Solution {public:Node* copyRandomList(Node* head) {std::map<Node*,int> node_map;std::vector<Node*> node_vector;Node* ptr = head;int i = 0;while (ptr) {node_vector.push_back(new Node(ptr->val));node_map[ptr] = i;ptr = ptr->next;i++;}node_vector.push_back(0);ptr = head;i = 0;while (ptr) {node_vector[i]->next = node_vector[i+1];if (ptr->random) {int id = node_map[ptr->random];node_vector[i]->random = node_vector[id];}ptr = ptr->next;i++;}return node_vector[0];}
};
Java
/*
// Definition for a Node.
class Node {int val;Node next;Node random;public Node(int val) {this.val = val;this.next = null;this.random = null;}
}
*/class Solution {public Node copyRandomList(Node head) {if(head==null) {return null;}Map<Node,Node> map = new HashMap<Node,Node>();Node p = head;while(p!=null) {Node newNode = new Node(p.val);map.put(p,newNode);p = p.next;}p = head;while(p!=null) {Node newNode = map.get(p);if(p.next!=null) {newNode.next = map.get(p.next);}if(p.random!=null) {newNode.random = map.get(p.random);}p = p.next;}return map.get(head);}
}
2.21. 合并两个有序链表
递归cpp:
/*** 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* l1, ListNode* l2) {ListNode *dummy_head = nullptr;if (l1 == nullptr) {return l2;} if (l2 == nullptr) {return l1;}if (l1->val > l2->val) {dummy_head = l2;dummy_head->next = mergeTwoLists(l1,l2->next);} else {dummy_head = l1;dummy_head->next = mergeTwoLists(l1->next,l2);}return dummy_head;}
};
递归java:
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode head = null;if (l1 == null) {return l2;}if (l2 == null) {return l1;}if (l1.val <= l2.val) {head = l1;head.next = mergeTwoLists(l1.next,l2);}else{head = l2;head.next = mergeTwoLists(l1,l2.next);}return head;}
}
dummy节点法cpp:
/*** 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* l1, ListNode* l2) {ListNode dummy_head(0);ListNode* pre = &dummy_head;while (l1 && l2) {if (l1->val > l2->val) {pre->next = l2;l2 = l2->next;} else {pre->next = l1;l1 = l1->next;}pre = pre->next;}if (l1) {pre->next = l1;}if (l2) {pre->next = l2;}return dummy_head.next;}
};
3.23. 合并K个升序链表
cpp排序重连实现:
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/bool cmp(const ListNode* a,const ListNode* b){return a->val < b->val;}
class Solution {public:ListNode* mergeKLists(vector<ListNode*>& lists) {std::vector<ListNode*> node_vec;// 把所有链表的节点存入node_vecfor (int i = 0;i < lists.size();i++) {ListNode* head = lists[i];while (head) {node_vec.push_back(head);head = head->next;}}// 进行排序并连接即可if (node_vec.size() == 0) {return NULL;}std::sort(node_vec.begin(),node_vec.end(),cmp);for (int i = 1;i < node_vec.size();i++) {node_vec[i-1]->next = node_vec[i];}node_vec[node_vec.size()-1]->next = NULL;return node_vec[0];}
};
写在最后
复杂度基本都是排序函数的复杂度,因此不再深究,冲!
20200909:链表类题目集合下相关推荐
- 20200908:链表类题目集合上
链表类题目集合上 题目 思路与算法 代码实现 写在最后 题目 1.力扣160. 相交链表 2.141. 环形链表 3.142. 环形链表 II 4. 86. 分隔链表 思路与算法 160相交链表:两种 ...
- 20210308 20210309 :链表类题目合集
链表类题目回顾 写在前面 题目 思路与算法 代码实现 写在前面 这一类的题目上一次编写是在刚好6个月之前,也就是我20200908和20200909的两篇博客涉及了今天这一篇的所有题目,均为链表相关. ...
- 【附段错误原因,最后两个测试点】1052 Linked List Sorting (25 分)【链表类题目总结】
立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 A linked list consists of a series of structures, which are not n ...
- java 获取所有实现类_Java动态获取实现某个接口下所有的实现类对象集合
Java动态获取实现某个接口下所有的实现类对象集合 最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行. 我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这 ...
- 力扣刷题心得(设计类题目)
设计类题目基本考察的是你对现实事物的抽象能力,一般会遇到一些类的设计.字符串切分.集合的使用(list.map.set.stack.deque)等,结束后我会更新一些关于这些集合的常见使用方法和场景. ...
- 4_常用类_集合_泛型
JavaSE_第四周 包装类 基本类型 包装类类型(引用类型:默认值都是null) byte Byte short Short int Integer long Long float Float do ...
- JavaSE(九)——正则表达式、Date类、集合、泛型
文章目录 1. 正则表达式 2. Math类 3. Date类 4. 集合 4.1 数组和集合的区别 4.2 集合功能 4.3 List集合的遍历 4.4 ArrayList.Vector.Linke ...
- 1.使用C++封装一个链表类LinkList
使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...
- 实验8.1 链表类的定义与实现
题目 参照教材中链表类LinkedList的定义(教材中的例程9-6.h),给出其实现,注意合理使用Node类(教材中的例程9-3.h)的成员函数.在测试程序中定义整型链表A和B,分别插入5个元素,使 ...
最新文章
- Python selenium 滑块验证--分析与实现
- 9、MySQL定义条件和处理程序
- 树莓派-语音聊天机器人+语音控制引脚电平高低
- [Javascript] Avoid Creating floats if they are not needed
- Hidden Markov Model
- ueditor滚动条
- 【一天一个C++小知识】006. 浮点数在计算机内部的表示与转换
- 从SynchronizedCollection说起
- SharePoint Designer中无法显示任何列表
- 华为云认证题库哪里有?华为认证哪个级别好呢?
- Bevy 游戏引擎开发指南
- MLA 格式引用怎么做好分析?
- SODA Foundation中国区启动仪式在联通沃云峰会(WCS)2019成功举行
- [渝粤教育] 重庆城市管理职业学院 脑洞大开背后的创新思维 参考 资料
- 全网最详细的Python+Requests接口测试教程:Fiddler抓包工具
- 四足机器人发展史及机器人盘点
- 软件测试 | 测试开发 | 测试人生 | 00后0经验应届毕业生拿下2线城市15W offer,好励志~
- 疫情下的科技内卷:租房被卷进“网购”时代
- 企业使用虚拟码号的优势!
- 文件路径问题( ./ 和 ../ 和 @/ )
热门文章
- 微服务架构的 10个 最佳实践 !
- 你凭什么被叫做程序员?
- 技术开发者应该如何构建小团队的微服务方案?
- 漫画:一文学会面试中常问的 IO 问题!
- 崛起的 Python,真的影响了 76 万人?
- 特斯拉起诉小鹏汽车员工窃取 30 多万份商业机密,何小鹏回应
- 百度牵手“造王者”汉得,ToB 战场将迎大变局?| 畅言
- 程序员如何处理被 “吃” 掉的异常?
- 离开中国多年后,Google 搜索想回来了!
- 滴滴 App 强制调取用户通讯录;子弹短信仍能泄露信息;特朗普炮轰谷歌 | 极客头条...