题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
。
图示两个链表在节点 c1
开始相交:
思路:A,B同时找到尾节点,尾节点的地址相同就是相交。时间复杂度(m+n)但是题目求是第一个交点,所以第二步:
求出连个链表的长度,La,Lb。
长的先走La-Lb,然后再一起走,第一个地址相等就是交点。
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *tailA=headA,*tailB=headB;
int lenA=1,lenB=1;
while(tailA->next){
tailA=tailA->next;
++lenA;
}
while(tailB->next){
tailB=tailB->next;
++lenB;
}
if(tailA!=tailB){
return NULL;
}
int num=abs(lenB-lenA);//算出差多少
//选出长的那个
struct ListNode* short1=headA, *long1=headB;
if(lenA>lenB){
short1=headB;
long1=headA;
}
while(num--){
long1=long1->next;
}
//最后一起走
while(short1&&long1){
if(short1==long1){
return short1;
}
short1=short1->next;
long1=long1->next;
}
return NULL;
}