题目
给定两个链表。判断两个链表是否有相交的节点,如果有则返回相交的节点,反之返回NULL。
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at ‘8’
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
原题链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/
思路
先分别计算两个链表的长度,然后得出长度差 M。让较长的链表先走 M 步,然后两个链表一起走,如果有相交的则返回节点即可。反之返回NULL。
- 复杂度分析
- 时间复杂度 O(n)。
- 空间复杂度 O(1)。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (headA == NULL || headB == NULL) {
return NULL;
}
int lengthA = 0;
int lengthB = 0;
ListNode* temp = headA;
while (temp) {
temp = temp->next;
lengthA++;
}
temp = headB;
while (temp) {
temp = temp->next;
lengthB++;
}
if (lengthA < lengthB) {
swap(headA, headB);
swap(lengthA, lengthB);
}
int diff = lengthA - lengthB;
while (diff > 0) {
headA = headA->next;
diff--;
}
while (headA) {
if (headA == headB) {
return headA;
}
headA = headA->next;
headB = headB->next;
}
return NULL;
}
};