/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
//方法一:对两个链表循环遍历,时间复杂度为O(m*n);
//方法二:(思路很好)
//直接判断两个尾结点是否相等,相交必相等
//怎么找交点呢?
//找尾的同时计算两个链表的长度,计算差值k,然后设计两个指针,长链表先走k步,再一起走,看哪个位置节点一样了;
if(headA == NULL || headB == NULL)
return NULL;
struct ListNode * curA = headA;
struct ListNode * curB = headB;
int lenA = 0; int lenB = 0; int k=0;
while(curA->next)
{
curA = curA->next;
lenA++;
}
while(curB->next)
{
curB = curB->next;
lenB++;
}
if(curA != curB)
return NULL;
//
else
{
if(lenA >= lenB)
{
k = lenA - lenB;
struct ListNode * fast = headA;
struct ListNode * slow = headB;
while(k--)
{
fast = fast->next;
}
while(fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return fast;
}
else
{
k = lenB - lenA;
struct ListNode * fast = headB;
struct ListNode * slow = headA;
while(k--)
{
fast = fast->next;
}
while(fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return fast;
}
}
}