203 Remove Linked List Elements

思路:考虑1 : 可能有多个节点符合;考虑2:命中节点是head;考虑3:命中节点是尾节点;考虑4:命中节点是中间的普通节点。
学习1:在linkedList 运用递归的思路还是很常见的,我还没有形成习惯。不断缩小问题规模。

    public ListNode removeElementsV2(ListNode head, int val) {if(head==null) return null;head.next = removeElementsV2(head.next,val);if(head.val == val){head = head.next;}return head;}

学习2:因为第一版有head节点的特殊处理,可以采取的措施是:加一个假的head或者是dummy节点。代码漂亮多了。

 public ListNode removeElementsV3(ListNode head, int val) {ListNode dummy  = new ListNode(-1);dummy .next = head;ListNode node = head;ListNode preNode = dummy ;while(node!=null){if(node.val==val){preNode.next = node.next;}else{preNode = node;}node = node.next;}return dummy .next;}

代码

160 Intersection of Two Linked Lists

思路:两个链表相交的起点。方法一:暴力搜索。listA的每个节点与listB的每个节点比较。时间复杂度O(m*n)。方法二:将listA的每个节点放入map中,遍历listB的每个节点与map比较。时间复杂度O(n),空间复杂度O(n)。这两个都不符合要求。
学习:难点是能够观察到:如果listA和listB有交集,那么从交集点开始之后所有的node是相等的,那么长度也是相同的。所以如果有长度差异,一定是在列表的前端。正如demo中所示。可以分别计算两个列表的长度lenA,lenB。长的列表先移动|lenA-lenB|步;之后两个指针一起移动直到所指节点相同。
代码

19 Remove Nth Node From End of List

思路:从尾部开始计算,删除第n个节点。
如果是从头部开始计算,删除第n个节点就比较好处理了。那就把问题转换一下。从尾部开始的第n个节点=从头部开始的第几个节点。
经过画图举例知道 应该是从头部开始第(len-n+1)节点,len是list长度。
假设要删除的节点nodeA ,应该是nodeA的上一个节点.next = nodeA.next。需要处理nodeA的上一个节点不存在的情况,这里加入一个dummy节点。
思路2:使用两个指针first、second。first先走n+1个节点(因为有dummy节点),然后second再走。当first到达队尾的时候,second距离队尾还有n个节点。
学习网页
代码

23 Merge k Sorted Lists

合并k个已经排序好的列表。这个题目有多种解决思路。参考文章。
思路1:把所有数据放在一个List,然后排序list。最后再创建ListNode。时间复杂度O(NlogN)O(NlogN)O(NlogN),N是所有节点的总数。所有数据放入List需要O(n);排序需要O(NlogN)O(NlogN)O(NlogN),创建节点需要O(N)。空间复杂度O(N)。
思路2:每次比较k个头节点,选择最小的节点。然后继续比较头节点。时间复杂度:O(kN)。k是数组长度,N是节点总数。每次比较需要比较k-1次,有N次比较。
思路3:对思路2的改进。每次把头结点的值放入优先队列中,取得最小值。时间复杂度:(O(Nlogk))(O(Nlogk))(O(Nlogk))。插入和弹出优先队列需要耗时O(logk)O(logk)O(logk),获得最小值耗时O(1)。
思路4:把k个队列合并问题转为2个队列合并问题。可以第0个和第1个合并得到result;result再继续和第2个、第3个队列合并。时间复杂度:O(kN)O(kN)O(kN)。N是两个list的长度。k个队列需要合并k-1次。
思路5:对思路4的改进。使用分治法(Divide and conquer)。合并0,1队列得到0队列;合并2,3队列得到2队列….;第二层 合并0,2队列得到0队列,合并4,6队列得到4队列;第三层合并0,4队列得到0队列…..一直到结束。时间复杂度:O(Nlogk)O(Nlogk)O(Nlogk)。N是两个队列的节点总数。因为会合并logk次。
代码

25 Reverse Nodes in k-Group

思路:将整个列表分成几个长度为k的子链表;对每一个子链表反转。长度不为k的子链表保持不动。
思路1:找到每一个子链表开始、结束下标,然后调用 92 Reverse Linked List II 。
这样会有一些重复的跳过m个节点的操作。可以进一步优化。从head开始数,数够了k步就从head开始反转长度为k的子链表;接着再从当前节点开始数。够k个就反转。不够就退出。
学习:自己反转的代码写的有点凌乱。再次学习了递归思想。

如果要反转链表1->2->3->4->5中1到3的部分得到:3->2->1->4->5。左侧从左向右是一种思路,右侧从右向左也是一种方法。

    public ListNode reverseKGroupV2(ListNode head, int k) {ListNode currentNode = head;int count =0;while(currentNode!=null && count!=k){count++;currentNode = currentNode.next;}if(count == k ){currentNode = reverseKGroupV2(currentNode,k);while(count>0){ListNode tmp = head.next;head.next = currentNode;currentNode = head;head = tmp;count--;}head = currentNode;}return head;}

代码

61 Rotate List

思路:因为k可能大于len(链表长度)。所以1 计算列表长度;2 k=k % len;3 将指针移动到len-k的位置,这个位置是开始rotate节点的上一个节点。4 反转。
代码

82 Remove Duplicates from Sorted List II

思路:留下链表中没有重复出现的元素。比较简单。直观地解决就可以。
代码

86 Partition List

思路:用两个指针smallHead,biggerHead分别指向小于x的节点列表和大于等于x的节点列表。最后将两个列表合并返回。
代码

143 Reorder List

思路:1 找到一半节点;2 反转第二部分链表;3合并两个链表。重要的是代码怎么写。
代码

147 Insertion Sort List

思路:处理位置i,从0到i-1是已经排序好的。我写代码的时候还是受数组排序的思维影响比较重。在学习代码中,别人把排序好的作为一个list处理。相对来说要比较好。
代码

LinkedList专题2相关推荐

  1. LinkedList专题3

    148. Sort List 问题:要求时间度O(NlogN)O(NlogN)O(NlogN),空间复杂度是常数,实现数组排序. 思路:之前做过linkedList的插入排序,时间复杂度应该是O(n2 ...

  2. LinkedList专题1

    237 Delete Node in a Linked List 思路:单向链表,只给定要删除的节点.怎么删除这个节点.参考.例如要删除节点node.一般来说我们需要将node.preNode.nex ...

  3. python扫雷 广度优先_Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)...

    Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  4. hashmap中用红黑树不用其他树_HashMap面试专题:常问六题深入解析

    引言 其实我很早以前就想写一篇关于HashMap的面试专题.对于JAVA求职者来说,HashMap可谓是集合类的重中之重,甚至你在复习的时候,其他集合类都不用看,专攻HashMap即可. 然而,鉴于网 ...

  5. Redis专题-底层数据结构与使用场景

    Redis介绍 Redis是一种基于键值对的NoSQL数据库,是一个基于内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件.它支持以string(字符串),hash(哈希),list(列表), ...

  6. 回溯专题leetcode

    这期刷leetcode上所有的回溯专题 93. 复原IP地址 这题先不考虑一些剪枝类问题,只是单纯考虑AC,我们设置的两个参数,一个index表示索引到哪个字符串下标了,另一个strs双端队列放入表示 ...

  7. LeetCode算法题-Design LinkedList(Java实现)

    这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...

  8. 20210501:字符串与哈希表力扣专题学习记录

    字符串与哈希表力扣专题学习记录 题目 思路与算法 代码实现 写在最后 题目 字母异位词分组 无重复字符的最长子串 重复的DNA序列 最小覆盖子串 思路与算法 字母异位词分组 : 按照字母序排序后再映射 ...

  9. JAVA集合专题+源码分析

    文章目录 Java集合专题 集合和数组的区别 数组 集合 区别 集合体系结构介绍 单列集合 [Collection ] Collection接口 迭代器 迭代器原理 增强for循环 List接口 对集 ...

最新文章

  1. 使用Python+OpenCV实现图像数据采集
  2. 没有文档,没有老员工讲解,悲催的新人如何快速熟悉一个新项目?
  3. Java动物类enjoy方法打印,面向对象编程题汇总
  4. 深度学习之tensorflow环境搭建
  5. 【渝粤教育】电大中专电子商务网站建设与维护 (21)作业 题库
  6. 免除抠图困扰,专供PNG图片素材网站你知道么?
  7. 查看数据库表空间.md
  8. 为什么 PUSH 推送要经常背锅?
  9. C语言pop_back用法,【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)...
  10. 快速创建简单的WCF跨平台服务
  11. 软件开发需求文档案例_第2部分:开发软件需求,一个案例研究
  12. 【日常】《中国统计年鉴》与《中国金融年鉴》数据表爬虫(附1985-2020所有Excel资源)
  13. IP地址格式 点分十进制
  14. 入门SpringBoot集成常用框架以及常见处理方式(括宽知识面)
  15. [亲测可用] Mac PS CC2019软件下载详细安装教程
  16. Segmentation Fault错误原因总结
  17. 字符串分隔 【问题描述】 输入两个字符串str和cut。cut由若干个字符构成,其中每个字符均可作为一个分隔字符对str进行分隔。
  18. 基于ROS的语音控制机器人(一):基本功能的实现
  19. LC1514. 概率最大的路径
  20. GTD时间管理:高效管理你的时间,GTD软件一款就够

热门文章

  1. hdu4011(水贪心)
  2. CWnd与HWND的区别与转换
  3. mysql中什么叫临时表_MySQL中使用临时表需要注意哪些?
  4. vue获取浏览器地址栏参数(?及/)路由+非路由实现方式
  5. docker中centos遇到sudo: command not found
  6. 图形桌面linux触摸,新手看招:用图形桌面访问Linux操作系统
  7. 下拉列表项过多会导致浏览器卡死
  8. 配置linux系统自带apache+php+mysql
  9. x3-02 java_Day13 -- Java流程控制02
  10. java 栈 泛型_java 泛型栈(数组实现) | 学步园