一、题目描述:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据保证整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
二、解题思路:
1、尾结点相同就相交,否则就不相交
2、求交点:长的链表先走(长度差)步,长短链表再同时走,第一个相同就是相交的起始节点
三、代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *tail1 = headA;
struct ListNode *tail2 = headB;
int lenA = 1;
int lenB = 1;
while(tail1)
{
tail1 = tail1->next;
lenA++;
}
while(tail2)
{
tail2 = tail2->next;
lenB++;
}
if(tail1 != tail2)
{
return NULL;
}
int gap = abs(lenA-lenB);
struct ListNode *longlist = headA;
struct ListNode *shortlist = headB;
if(lenA < lenB)
{
longlist = headB;
shortlist = headA;
}
while(gap--)
{
longlist = longlist->next;
}
while(longlist != shortlist)
{
longlist = longlist->next;
shortlist = shortlist->next;
}
return longlist;
}