力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
SOLUTION:
1.先判断两个链表是否相交,通过判断尾节点是否相同来判断是否相交,而且遍历找尾的同时分别记录下两个链表的长度lenA,lenB。O(N)
2.不相交返回NULL。相交的话,让长的先走差距步,然后两个同时走,第一个相等的节点即所求节点。O(N)
拿这个举例:
找尾同时记录长度:
struct ListNode* tailA = headA,*tailB = headB; int lenA= 1,lenB = 1; //A链表的尾 while(tailA->next) { tailA = tailA->next; lenA++; } //B链表的尾 while(tailB->next) { tailB = tailB->next; lenB++; }
长的先走差距步:
//不相交 if(tailA != tailB) return NULL; //相交情况 //差距步 int gap = abs(lenA - lenB); //不知道谁长,假设法 struct ListNode* longer = headA, *shorter = headB; if(lenA<lenB) { longer = headB; shorter = headA; } //长的先走差距步 while(gap--) { longer = longer->next; }
第一个相等的就是交点:
while(longer != shorter) { longer = longer->next; shorter = shorter->next; } return longer;