题目:
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
示例 2:
输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Reference of the node with value = 2
输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。
示例 3:
分析:
先求出两个链表的成都,然后让长的那个链表走差距步,然后两个一起走,走到相遇为止。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* l1=headA;
ListNode* l2=headB;
if(headA==nullptr || headB==nullptr)
return nullptr;
//统计两个链表的长度
int lenA=0;
int lenB=0;
while(l1)
{
lenA++;
l1=l1->next;
}
while(l2)
{
lenB++;
l2=l2->next;
}
int gas=abs(lenA-lenB);//差距
ListNode* Long=headA;
ListNode* Short=headB;
if(lenA<lenB)
{
Long=headB;
Short=headA;
}
//来到这,长的那个就会Long了
//长的那个链表先走差距步
while(gas)
{
Long=Long->next;
gas--;
}
//走完差距步后一起走,直到相遇为止
while(Long!=Short)
{
Long=Long->next;
Short=Short->next;
}
return Long;
}