题目描述
思路
(1) 链表相交情况:(Y字形)
两个链表相交像这样Y字形,两个链表的尾结点的地址也是一样的,相交后链表长度一样,如果可以求出两个链表前面的长度差,长的先走相距步数,在同时一起走,就可以判断当两个指针地址相等时就是相交结点。
(2) 链表不相交情况:
- 两个链表不想交,尾结点地址不同;
- 当一个链表或者两个链表都为空时,两个链表不相交。
大致流程:
判断链表是不是相交
A --> C
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode* curA=headA;
struct ListNode* curB=headB;
//如果一个或两个都是空链表,返回空
if(headA==NULL||headB==NULL)
{
return NULL;
}
//不为空链表的话,找相差的长度
int lenA=0,lenB=0;
while(curA)
{
curA=curA->next;
lenA++;
}
while(curB)
{
curB=curB->next;
lenB++;
}
if(curA!=curB)
{
return NULL;
}
//假设长的是headA,短的是headB
struct ListNode* longlist=headA;
struct ListNode* shortlist=headB;
//
if(lenA<lenB)
{
longlist=headB;
shortlist=headA;
}
//长的先走相差步数
int gaps=abs(lenB-lenA);
while(gaps--)
{
longlist=longlist->next;
}
//不相等就进入循环
while(longlist!=shortlist)
{
longlist=longlist->next;
shortlist=shortlist->next;
}
return shortlist;
}