题目leetcode141:环形链表
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
用例
输入:head = [3,2,0,-4], pos = 1
输出:true
输入:head = [1,2], pos = 0
输出:true
解题思路
利用快慢指针,如果两指针能相遇,且不为None,那么链表有环,当然也可以用哈希表存储
代码
1 | # Definition for singly-linked list. |
题目142. 环形链表 II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
解题思路
利用快慢指针进行寻找,如果两指针可以相遇且不为None,那么就有环,接着记录该相遇点,并从链表的
头节点开始同步前进,两点再次相遇时,节点就是环的入口
其证明可以参照题解
也可以用哈希表记录
代码
1 | class Solution(object): |
题目160. 相交链表和面试题52. 两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。
解题思路-参照题解区
创建两个指针 pApA 和 pBpB,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。
当 pApA 到达链表的尾部时,将它重定位到链表 B 的头结点 (你没看错,就是链表 B); 类似的,当 pBpB 到达链表的尾部时,将它重定位到链表 A 的头结点。
若在某一时刻 pApA 和 pBpB 相遇,则 pApA/pBpB 为相交结点。
想弄清楚为什么这样可行, 可以考虑以下两个链表: A={1,3,5,7,9,11} 和 B={2,4,9,11},相交于结点 9。 由于 B.length (=4) < A.length (=6),pBpB 比 pApA 少经过 22 个结点,会先到达尾部。将 pBpB 重定向到 A 的头结点,pApA 重定向到 B 的头结点后,pBpB 要比 pApA 多走 2 个结点。因此,它们会同时到达交点。
如果两个链表存在相交,它们末尾的结点必然相同。因此当 pApA/pBpB 到达链表结尾时,记录下链表 A/B 对应的元素。若最后元素不相同,则两个链表不相交。
也可以哈希表
代码
1 | class Solution: |
题目235. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
解题思路
利用好二叉搜索树左子树的值都小于根以及右子树的值都大于根的特性
代码
1 | # class TreeNode: |
题目236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
解题思路
问题实际可以转化为链表的公共节点问题
代码
1 | # class TreeNode: |
发布时间: 2020-05-10
最后更新: 2020-05-15
本文标题: LCA——最近公共节点题目题解类型
本文链接: http://huangketsudou.github.io/2020/05/10/LCA/
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处