分析:
只要两个链表有公共节点,那么从第一个公共节点开始,之后的所有节点都是重合的。两个节点的拓扑结构类似与Y字形。对公共节点的理解很重要。
思路:
(1)首先, 分别遍历两个链表,得到两个链表的长度 shortLen,LongLen.
(2)然后,先让长链表从头遍历LongLen-shortLen步;短链表不便利
(3)接着, 短链表和长链表同步遍历;则第一个相同节点就是所求的第一个公共节点
时间复杂度为0(m+n)
int getListLen(ListNode *pHead)
{
int len=0;
ListNode *pNode=pHead;
while(pNode!=NULL)
{ len++;
pNode=pNode->next;
}
return len;
}
ListNode * FindCommon(ListNode *pHead1, ListNode *pHead2)
{
ListNode *shortList=pHead1;
ListNode *longList=pHead2;
shortLen=getListLen(shortList);
LongLen=getListLen(longList);
diffLen=LongLen-shortLen;
if(diffLen<0)
{ LongList=pHead1;
shortList=pHead2;
diff=-diff;
}
//长链表先走diff步
for(int i=0;i<diff;i++)
LongList=LongLIst->next;
//然后,长链表和短链表一起遍历
while(LongList!=shortList)
{ LongList=LongList->next;
shortList=shortList->next;
}
ListNode *commonNode=LongList;
return commonList;
}