题目:
- 给你两个单链表的头节点
headA
和headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null
。图示两个链表在节点c1
开始相交:
- 题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。
示例:
- 输入: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
- 输出: Intersected at ‘8’
- 解释: 相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
解题思路:(动规😋)
先分别遍历两个链表,得其长度。然后进行对其操作,让长度长的链表先走到与短链表长度一致的位置,然后再分别遍历两链表,若相等则返回,否则返回NULL。
版本二:C++
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
auto a = headA;
auto b = headB;
int lenA = 0, lenB = 0;
while(a){
lenA++;
a = a->next;
}
while(b){
lenB++;
b = b->next;
}
a = headA;
b = headB;
if(lenB > lenA){
swap(lenA, lenB);
swap(a, b);
}
int tempLen = lenA - lenB;
while(tempLen--){
a = a->next;
}
while(a){
if(a == b) return a;
a = a->next;
b = b->next;
}
return NULL;
}
};
时间复杂度:
O
(
n
+
m
)
O(n + m)
O(n+m)
空间复杂度:
O
(
1
)
O(1)
O(1)