链表类题目集合下

  • 题目
  • 思路与算法
  • 代码实现
  • 写在最后

题目

1.138. 复制带随机指针的链表

2.21. 合并两个有序链表

3.23. 合并K个升序链表

思路与算法

  1. 返回深拷贝这个题目的意思读清楚就好了,要去找确定那个random指针到底指向了哪个节点。这是关键。用map来映射比较清晰,附上cpp和java两种语言的代码题解
  2. 合并链表的题目思路大致相同,对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:链表类题目集合下相关推荐

  1. 20200908:链表类题目集合上

    链表类题目集合上 题目 思路与算法 代码实现 写在最后 题目 1.力扣160. 相交链表 2.141. 环形链表 3.142. 环形链表 II 4. 86. 分隔链表 思路与算法 160相交链表:两种 ...

  2. 20210308 20210309 :链表类题目合集

    链表类题目回顾 写在前面 题目 思路与算法 代码实现 写在前面 这一类的题目上一次编写是在刚好6个月之前,也就是我20200908和20200909的两篇博客涉及了今天这一篇的所有题目,均为链表相关. ...

  3. 【附段错误原因,最后两个测试点】1052 Linked List Sorting (25 分)【链表类题目总结】

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 A linked list consists of a series of structures, which are not n ...

  4. java 获取所有实现类_Java动态获取实现某个接口下所有的实现类对象集合

    Java动态获取实现某个接口下所有的实现类对象集合 最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行. 我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这 ...

  5. 力扣刷题心得(设计类题目)

    设计类题目基本考察的是你对现实事物的抽象能力,一般会遇到一些类的设计.字符串切分.集合的使用(list.map.set.stack.deque)等,结束后我会更新一些关于这些集合的常见使用方法和场景. ...

  6. 4_常用类_集合_泛型

    JavaSE_第四周 包装类 基本类型 包装类类型(引用类型:默认值都是null) byte Byte short Short int Integer long Long float Float do ...

  7. JavaSE(九)——正则表达式、Date类、集合、泛型

    文章目录 1. 正则表达式 2. Math类 3. Date类 4. 集合 4.1 数组和集合的区别 4.2 集合功能 4.3 List集合的遍历 4.4 ArrayList.Vector.Linke ...

  8. 1.使用C++封装一个链表类LinkList

     使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...

  9. 实验8.1 链表类的定义与实现

    题目 参照教材中链表类LinkedList的定义(教材中的例程9-6.h),给出其实现,注意合理使用Node类(教材中的例程9-3.h)的成员函数.在测试程序中定义整型链表A和B,分别插入5个元素,使 ...

最新文章

  1. Python selenium 滑块验证--分析与实现
  2. 9、MySQL定义条件和处理程序
  3. 树莓派-语音聊天机器人+语音控制引脚电平高低
  4. [Javascript] Avoid Creating floats if they are not needed
  5. Hidden Markov Model
  6. ueditor滚动条
  7. 【一天一个C++小知识】006. 浮点数在计算机内部的表示与转换
  8. 从SynchronizedCollection说起
  9. SharePoint Designer中无法显示任何列表
  10. 华为云认证题库哪里有?华为认证哪个级别好呢?
  11. Bevy 游戏引擎开发指南
  12. MLA 格式引用怎么做好分析?
  13. SODA Foundation中国区启动仪式在联通沃云峰会(WCS)2019成功举行
  14. [渝粤教育] 重庆城市管理职业学院 脑洞大开背后的创新思维 参考 资料
  15. 全网最详细的Python+Requests接口测试教程:Fiddler抓包工具
  16. 四足机器人发展史及机器人盘点
  17. 软件测试 | 测试开发 | 测试人生 | 00后0经验应届毕业生拿下2线城市15W offer,好励志~
  18. 疫情下的科技内卷:租房被卷进“网购”时代
  19. 企业使用虚拟码号的优势!
  20. 文件路径问题( ./ 和 ../ 和 @/ )

热门文章

  1. 微服务架构的 10个 最佳实践 !
  2. 你凭什么被叫做程序员?
  3. 技术开发者应该如何构建小团队的微服务方案?
  4. 漫画:一文学会面试中常问的 IO 问题!
  5. 崛起的 Python,真的影响了 76 万人?
  6. 特斯拉起诉小鹏汽车员工窃取 30 多万份商业机密,何小鹏回应
  7. 百度牵手“造王者”汉得,ToB 战场将迎大变局?| 畅言
  8. 程序员如何处理被 “吃” 掉的异常?
  9. 离开中国多年后,Google 搜索想回来了!
  10. 滴滴 App 强制调取用户通讯录;子弹短信仍能泄露信息;特朗普炮轰谷歌 | 极客头条...