题目:
输入两个链表,找出它们的第一个公共结点。

首先,我们要考虑几种情况:
- 两个链表中存在空链表
当两个链表中,存在空链表时,说明不存在非空公共节点,直接返回null;
- 两个链表为包含关系

只需要判定两个链表的长度,获取较短链表的起始节点即使两个链表的第一个公共节点;
- 两个链表相交

需要求出两个链表长度,遍历至相同长度的链表起始点,然后逐节点遍历,逐节点比较,相等时返回当前节点;
从上面的分析,我们其实可以提取共同点,保留不同点,得到实现逻辑:
- 判断是否存在空链表,是则返回null,结束执行;否则进行下一步骤;
- 遍历链表,获取各自链表长度,进行下一步骤;
- 对比遍历后的节点是否相等(因为如果存在公共节点,最后一个节点一定是相同的节点),否则返回null,说明两个链表不相交;是则进行下一步骤;
- 进行链表长度,假设长的链表长度为long,短的链表长度为short,长链表节点移动到(long-short)后的节点;
- 当当前长链表的节点不等于短链表的节点,进行遍历,逐节点移动,直到两个节点相等,返回节点,这就是两个聊表的第一个公共节点;
源码:
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2){
//判断链表中是否存在空链表
if(pHead1==null||pHead2==null){
return null;
}
//获取链表长度
ListNode t1 = pHead1;
ListNode t2 = pHead2;
int len1 = 0,len2=0;
while(t1!=null){
t1 = t1.next;
len1++;
}
while(t2!=null){
t2 = t2.next;
len2++;
}
//判断链表是否相交
if(t1!=t2){
System.out.println("两个链表不相交");
return null;
}
//使两个链表变为相同长度的链表
int k=0;
if(len1>len2){
k=len1-len2;
while(k!=0){
k--;
pHead1 = pHead1.next;
}
}else{
k = len2-len1;
while(k!=0){
k--;
pHead2 = pHead2.next;
}
}
//逐节点对比
while(pHead1!=pHead2){
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return pHead1;
}
494

被折叠的 条评论
为什么被折叠?



