一、题目描述
二、思路
- 分别对A链表和B链表设置虚拟头节点pA、pB;
- 循环得出两个链表的长度lenA、lenB,计算差值len然后让长度较大的移动到第(len + 1)个节点,继而让两个指针同时移动,并判断(p -> next)的地址是否相同;
- 若找得到,返回p -> next;若找不到,返回NULL;
- 思路如下图:
三、解题过程
-
计算链表长度
分别定义lenA和lenB与各自的虚拟头节点,遍历链表:
int lenA = 0;
int lenB = 0;
struct ListNode* pA = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* pB = (struct ListNode*)malloc(sizeof(struct ListNode));
pA -> next = headA;
pB -> next = headB;
for(; headA; lenA ++) headA = headA -> next;
for(; headB; lenB ++) headB = headB -> next;
-
移动较长链表的指针
移动较长链表指针的位置至与较短链表指针为逆序的同一位置:
struct ListNode* longIndex = lenA > lenB ? pA : pB;
struct ListNode* shortIndex = lenA < lenB ? pA : pB;
int len = lenA > lenB ? lenA - lenB : lenB - lenA;
for(; len; len --) {
longIndex = longIndex ->next;
}
-
寻找相交点
while(longIndex -> next != shortIndex -> next){
longIndex = longIndex -> next;
shortIndex = shortIndex -> next;
}
-
返回相交的起始节点
return longIndex -> next;
四、代码
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
int lenA = 0;
int lenB = 0;
struct ListNode* pA = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* pB = (struct ListNode*)malloc(sizeof(struct ListNode));
pA -> next = headA;
pB -> next = headB;
for(; headA; lenA ++) headA = headA -> next;
for(; headB; lenB ++) headB = headB -> next;
struct ListNode* longIndex = lenA > lenB ? pA : pB;
struct ListNode* shortIndex = lenA <= lenB ? pA : pB;
int len = lenA > lenB ? lenA - lenB : lenB - lenA;
for(; len; len --) {
longIndex = longIndex ->next;
}
while(longIndex -> next != shortIndex -> next){
longIndex = longIndex -> next;
shortIndex = shortIndex -> next;
}
return longIndex -> next;
}
时间复杂度:O(m + n),空间复杂度:O(1)。