题目描述
输入两个链表,找出它们的第一个公共结点
思路:
两个链表找到公共的结点,可以肯定的是公共结点后面的结点都是相同的,那么现在就出现两种情况,一种情况是两个链表的长处相等,此时同时遍历这两个链表就可以找到。另外一种情况则是两个链表的长度不一样,此时就第一步就需要解决这个长度差,因此可以先得到两个链表的长度,将长的链表移动长度差。然后两个链表再同时走(原因是两个链表只能是不是公共区才会造成链表不一样长)。
第一种实现:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
int len1 = findLen(pHead1);
int len2 = findLen(pHead2);
if(len1 < len2){
for(int j = 0; j < len2 - len1; j ++){
pHead2 = pHead2.next;
}
while(pHead1 != pHead2){
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return pHead1;
}else if(len1 > len2){
for(int j = 0; j < len1 - len2; j ++){
pHead1 = pHead1.next;
}
while(pHead1 != pHead2){
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return pHead1;
}else{
while(pHead1 != pHead2){
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return pHead1;
}
}
public static int findLen(ListNode node){
int i = 0;
while(node != null){
node = node.next;
i ++;
}
return i;
}
}
第二种实现:
/*
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 p1 = pHead1;
ListNode p2 = pHead2;
while(p1 != p2){//如果这两个链表的长度一样,那么就同步。如果长度不一样,那么样能第一圈解决这个距离差
p1 = (p1 == null? pHead2 : p1.next);
p2 = (p2 == null? pHead1 : p2.next);
}
return p1;
}
}