跟Labuladong刷题第一天

·  阅读 32
  1. 合并两个有序链表
  • 思路:设置两个指针,分别对两个链表从头开始遍历并比较其值大小,决定合并的结点顺序;
  • 要点:
  • 1)设置虚拟头结点后,要设置返回值为dummy.next,否则返回的链表会加上虚拟头结点,其值为-1;
  • 2)遍历链表时,要判断是否已空,若有一个链表为空,则不必再对结点值作比较;
  1. 合并K个有序链表
  • 思路:每次使用优先级队列(二叉堆)选出k个链表中值最小的结点加入合并链表中。
  • 要点:
  • 优先级队列的使用;
  • 算法时间复杂度的分析:O(NlogK)O(NlogK) ,其中K为待合并链表的条数,N为所有链表中结点的总个数;
  1. 寻找链表的倒数第K个结点;=>删除链表的倒数第n个结点;
  • 思路:在只遍历一次链表的前提下,找到倒数第K个结点。先设置一个指针P1指向链表的头结点,让p1走k步,再设置另一个指针p2指向链表的头结点,此后p1,p2同时向前走,当p1走到链表末尾空指针时,p2指向第倒数k个结点;
  • 要点:设置第二个指针p2的时机是第一个指针p1走了K步;两个指针都是从链表头指针开始遍历;
  1. 寻找链表中点=>判断链表中是否有环
  • 思路:设置快慢指针从头结点开始对链表进行遍历,慢指针每走一步,快指针走两步。快慢指针相遇,说明含有环。
  • 要点:遍历结束的条件为fast != null && fast.null != null
  • 问题1:为什么不是fast.next != null && fast.next.next != null?
  • 问题2:换成fast.next != null && fast != null 也不行?
分类:
代码人生
标签:
分类:
代码人生
标签:
收藏成功!
已添加到「」, 点击更改