参考了,下面这是作者,我是参考的
作者:hs-zhangsan
链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/solution/mian-shi-ti-0207lian-biao-xiang-jiao-by-0dz05/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
//使用两个指针分别统计两个来链表的长度
struct ListNode* currA = headA;
struct ListNode* currB = headB;
int countA = 0, countB = 0;
while (currA) {
countA++;
currA = currA->next;
}
while (currB) {
countB++;
currB = currB->next;
}
//让 headA 指向较长的链表,便于后续操作
if (countB > countA) {
struct ListNode* temp = headA;
headA = headB;
headB = temp;
}
int diffence = countA > countB ? countA - countB : countB - countA;//计算差值
while (diffence--) { //是AB对齐
headA = headA->next;
}
while (headA) {
if (headA == headB) {//一开始理解为值相等,后面才知道我不知道能不能这么理解
//就是,这里既然链表相交,那他们应该是地址相等
return headA;
}
headA = headA->next;
headB = headB->next;
}
return NULL;
}
/**
* 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;
while(curA!=curB)
{
curA=curA!=NULL?curA->next:headB;
curB=curB!=NULL?curB->next:headA;
}
return curA;
}