思路:
1. 我们算出两个链表的长度lenA,lenB。我们在这里最后判断一下,两个链表的尾节点是否是一样的,如果是相交链表,那它们的尾节点一定是一样的。
2. 算出长链表和短链表的差距n(n = | lenA- lenB |)
3. 让较长的那个链表往后走n步
4. 短链表的指针 和 长链表的指针处于相同的位置,同时往后走,找到第一个相同的节点。
代码:
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode* curA = headA;
struct ListNode* curB = headB;
int lenA =0;
int lenB =0;
//两个链表的长度
while(curA)
{
lenA++;
curA = curA->next;
}
while(curB)
{
lenB++;
curB = curB->next;
}
//如果是相交链表,尾节点一定是同一个
if(curA != curB)
{
return NULL;
}
//利用假设法得出长链表和短链表
struct ListNode* longlist = headA;
struct ListNode* shortlist = headB ;
if(lenA < lenB)
{
longlist = headB;
shortlist = headA;
}
//长链表的长度 - 短链表的长度
int n = abs(lenA - lenB);
while(n--)
{
longlist=longlist->next;
}
//找出第一个相同的节点
while(longlist != shortlist)
{
longlist = longlist->next;
shortlist = shortlist->next;
}
return shortlist;
}