基本概念:两个链表是单链表,如果两个链表有公共节点,那么这两个链表从某一节点开始,它们都指向同一个节点,之后它们所有的节点都是重合的,不可能再出现分叉。所以拓扑形状看起来是Y型。
算法思想:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。在第二次遍历的时候,先在较长的节点上走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的公共的节点。
public class Solution {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2){
int length1 = getLength(pHead1);
int length2 = getLength(pHead2);
int lengthDif = length1 - length2;
ListNode pLong = pHead1;
ListNode pShort = pHead2;
if(length2 > length1){
pLong = pHead2;
pShort = pHead1;
lengthDif = -lengthDif;
}
for(int i = 0;i < lengthDif;i++){
pLong = pLong.next;
}
while(pLong != null && pShort != null && pLong != pShort){
pLong = pLong.next;
pShort = pShort.next;
}
ListNode pFirst = pShort;
return pFirst;
}
private int getLength(ListNode pHead){
int length = 0;
ListNode pNode = pHead;
while(pNode != null){
length++;
pNode = pNode.next;
}
return length;
}
}