常见链表面试题解题思路
程序员文章站
2022-05-06 11:04:47
...
1 找中点
快慢指针
- 奇数中点,偶数上中点
- 奇数中点,偶数下中点
- 奇数中点前一个,偶数上中点前一个
- 奇数中点前一个,偶数下中点前一个
2 回文
- 遍历压栈法
- 右半部分压栈法
- 右半部分改指针法
3 左大中等右小
- 放入数组,partition
- 链表法
4 特殊链表复制
// 提供特殊的节点
class Node {
int value;
Node next; // 指向下一个节点,是无环的
Node rand; // 随便指向一个节点 ,可能有环
Node(int data) {
this.value = data;
}
}
-
map
-
key 是 Node,Value 是 Node*
-
map.get(Node).next == map.get(Node.next)
-
map.get(Node).rand == map.get(Node.rand)
-
-
构建映射关系
- node1.next = node*,node1*.next = node2 … (原来两个node节点中插入一个复制节点)
- 当 node1.rand 指向不为空时,node1*.rand = node1.rand.next
- 将复制节点分离
5 俩链表相交问题
三种情况
-
两个无环相交
-
一个无环一个有环,不可能相交
-
两个有环相交
5.1 找到入环节点
单链表入环不可能出来
如图1:快指针走两步,慢指针走一步,总会快慢指针相遇
如图2:相遇后,快指针回到头结点,改为一次走一步,第二次相遇时的节点即为头结点
5.2 俩无环链表相交节点
- 俩链表最后的节点是同一个节点
- node1 和 node2 一直next,直到节点下一个节点为null时停止
- 俩节点指向不同地址说明一定没相交
- 长链表走一个差值的 next 次数
- 长短链表同时next,直到俩节点相等时,说明是第一个相交节点
5.3 俩有环链表相交节点
- 入环节点相同,在入环处相交:loop1 == loop2,改无环代码,遇到 loop 停
- 入环节点不同,在入环前相交:loop1 != loop2,改俩无环链表相交代码
上一篇: 常见的单链表面试题——进阶篇
下一篇: 链表面试题