标签:p1 ListNode 链表 牛客 pHead1 pHead2 网刷题 null
问题描述
输入两个链表,找出它们的第一个公共结点。
输入描述:
输入两个链表
输出描述:
输出第一个公共节点
示例
示例1
输入
4->1->8->4->5;5->0->8->4->5
输出
8->4->5
解决思路
分析
- 遍历链表1,使用额外的空间存储,遍历链表2,查找是否有相同的元素,相同为第一个公共节点。
2.使用双指针法,但是双指针法的前提是遍历的链表的长度有规律,但是这两个链表第一个公共节点前的长度可能不一样,这里我们主要解决这个问题
(1)假设链表1的长度是a,链表2的长度是b
(2)使用双指针法的前提是两个链表的长度相等,那样每个链表一次next肯定会找到第一个公共节点
(3)虽然a和b不想等,但是a+b=b+a,我们可以创造了两个长度相等的链表
(4)有了a+b=b+a这个条件,我们就可以使用双指针法,当遍历到链表1的空节点,此时追加上链表2的长度;当遍历到链表2的空节点,此时追加上链表1,最终可以找到公共节点
方法
- hash法。
- 双指针法
代码实现
思路1:hash法
// 思路1
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
Set<ListNode> temp = new HashSet<>();
while (pHead1 != null) {
temp.add(pHead1);
pHead1 = pHead1.next;
}
while (pHead2 != null) {
if (temp.contains(pHead2)) {
return pHead2;
}
pHead2 = pHead2.next;
}
return null;
}
}
时间复杂度分析:
O(Max(M,N)):假设最后一个节点为公共节点,则需要遍历完链表1和链表2才能找到,所以时间复杂度为链表长度比较大的一项。
空间复杂度分析:
O(M):使用了额外Set集合存储链表1的节点。
思路2:双指针法
// 思路2
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if (pHead1 == null || pHead2 == null) return null;
ListNode p1 = pHead1;
ListNode p2 = pHead2;
while (p1 != p2) {
p1 = p1.next;
p2 = p2.next;
if (p1 != p2) {
if (p1 == null) p1 = pHead2;
if (p2 == null) p2 = pHead1;
}
}
return p1;
}
}
时间复杂度分析:
O(M+N):最终遍历的是两给链表加载一起的长度。
空间复杂度分析:
O(1):没有使用额外的空间。
小伙伴如果想测试的话,可以直接到牛客网这个链接做测试
标签:p1,ListNode,链表,牛客,pHead1,pHead2,网刷题,null 来源: https://blog.csdn.net/qq_35398517/article/details/113767581
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。