思路:
- 先分别把这两个链表遍历一遍(同时用两个个计数器记录下来两个链表的长度m,n);如果他们的最后一个结点相同,就说明相交,如果不相同直接返回空;
- 如果最后一个结点相同:让长度较长的链表从头开始,先走|m-n|次,然后两个一起走,同时比较两个结点是否相同,如果相同,说明找到了相交点,直接返回即可。
代码实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
//不为空的情况
if(headA && headB)
{
struct ListNode *tailA = headA, *tailB = headB;
int lenA = 0, lenB = 0;
int Long = 0;
//找尾
while(tailA->next)
{
tailA = tailA->next;
lenA++;
}
while(tailB->next)
{
tailB = tailB->next;
lenB++;
}
//判断尾结点是否相同
if(tailA == tailB)
{
struct ListNode *curA = headA, *curB = headB;
int k = 0;
if(lenA>lenB)
{
Long = lenA;
k= lenA-lenB;
while(k--)
{
curA = curA->next;
}
}
else
{
Long = lenB;
k = lenB-lenA;
while(k--)
{
curB = curB->next;
}
}
while(curA != curB)
{
curA = curA->next;
curB = curB->next;
}
return curA;
}
else
{
return NULL;
}
}
else
return NULL;
}