给出两个单向链表的头指针,比如pHead1和pHead2,判断这两个链表是否相交,如果相交求出第一个相交的结点。
方法一:由于两个链表没有环,我们可以把第二个链表的尾指针指向第一个链表的头结点,此时我们从链表二出发,判断这个新的链表是否存在环,如果存在环则说明这两个链表相交,否则,这两个链表不相交。环的连接点即两个链表的第一个交点。在上一篇博客中我们已经说过如何判断一个链表是否存在环,而且我们也求出带环链表的连接点。在此我们不在写代码。
方法二:如果两个没有环的链表相交于某一点的话,那么在这个节点之后的所有的节点都是两个链表所共有的。根据这个性质,我们可以得到:如果两个链表相交,那么最后一个节点一定是共有的。首先,我们先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时,我们和第一个链表的最后一个节点做比较,如果相同,则相交,否则,不想交。
运用此方法,我们求第一个相交的节点,首先我们求出链表一的长度len1和链表二的长度len2,如果链表一的长度大于链表二的长度,那么我们先让指向链表一的指针向后移动len1 - len2步,然后两个指针同时出发,判断两个指针是否相等,首次相等的时候,即两个链表的交点。//判断两个链表是否相交
bool isIntersect01(ListNode *pHead1,ListNode *pHead2)
{
if(pHead1 == NULL || pHead2 == NULL)
return false;
while(pHead1->next)
{
pHead1 = pHead1->next;
}
while(pHead2->next)
{
pHead2 = pHead2->next;
}
if(pHead1 == pHead2)
{
return true;
}
else
{
return false;
}
}
ListNode * getIntersect(ListNo