第二次
面试题
一、
长度为n的链表 求倒数第k 个结点
-
两次遍历
先求出n的值(用一个循环)
然后求n-k -
一次遍历 双指针
同一个位置开始 间隔k-1
当其中一个指针指到最后一个时,另一个就是所求
二、(进一步延伸)
123456 -》 561234
将指向最后一个结点的指针指向第一个结点,成为循环链表,然后再断开链表 断开之前要获取到5的结点
第三次
数组:逆置 回文
容器 (列表 字典 集合)
-
求单链表中循环链表中的入环结点
1.用集合 第一个出现两次的结点就是入环结点 缺点:借助了额外的存储空间
2.快慢指针:准备两个指针,当指针相遇后,快指针回到起点,慢指针不变,快指针改为每次走一步,当两个指针再次相遇时,这个结点就是入环结点 -
判断两个单链表是否相交
六种情况,先判断是否有环(快慢指针)
- 都是无环单链表(第一种和第二种):,只需找到两个链表的尾节点(无环单链表如果相交,必然会有相同的尾节点)
2.(第五种情况)如果一个有环,一个无环,则肯定不相交
3.(第三种):有共同的入环结点
4.(第四种 第六种):先找到两个入环结点,然后用快慢指针,慢指针绕圈一周,如果与快指针相遇,则处于同一个环,否则处于不同的环
- 都是无环单链表(第一种和第二种):,只需找到两个链表的尾节点(无环单链表如果相交,必然会有相同的尾节点)
-
两个无环单链表相交,找到相交结点
- 借助容器 集合
- 双指针:匀速指针,如果相遇则是相交结点,若没有相遇则在指到null后交换指针从头开始,相遇时则为相交结点(最多交换一次),原理:两者走的距离相同
这个方法也可以用来判断两个链表是否相交,如果不相交则返回null,相交则返回相交结点
-
判断一个单链表是否是回文链表
1.借助容器 数组 ,若数组是回文数组,则链表也为回文链表
2.遍历一遍后,得到链表结点个数,进而遍历得到倒数结点
3.递归:
** 2020年10月20日17:29:20 **
- 当n远远大于m的时候,求倒数第m个元素
- 维护一个容量为M的小根堆(小-》大 优先队列):
先依次扫描,建立大小为M小根堆,当扫描够m个之后,只需要和根节点比较,然后继续进行siftdown操作