目录
一、题目描述
输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。
例如,输入{1,2,3},{4,5},{6,7}时,两个无环的单向链表的结构如下图所示:
可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。
要求:时间复杂度不超过O(n),空间复杂度不超过O(1)。
二、解题思路
对于该题我首先想到的是对两个链表同时进行遍历,若两个结点相同,则直接返回相同结点,但是提交之后无法通过,最后发现我的这种解法只适合等长链表求相同结点,这种解法并不可行。
正确解法:
由于时间复杂度不超过O(n),那么最多只能遍历一次,我们可以设置两个结点分别指向链表的首元结点,两个链表都进行遍历,就是如果当前的链表遍历完之后,就让其遍历另一条链表,因为遍历的速度一样,且遍历的总长度一样,如果有相同结点则一定会在遍历结束前找到,否则没有相同结点。
三、代码实现
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode cur1=pHead1;
ListNode cur2=pHead2;
while(cur1!=cur2){//这里未用equals原因是题目要求的结点相同,不仅仅是内容上相同,更重要的是地址相同,也就是同一个结点。
if(cur1==null){
cur1=pHead2;
}else{
cur1=cur1.next;
}
if(cur2==null){
cur2=pHead1;
}else{
cur2=cur2.next;
}
}
return cur1;
}
}