返回
抽丝剥茧解题题解,看懂相交链表,扫清技术难点
前端
2023-10-17 16:24:39
剖析相交链表,玩转链表数据结构
相交链表问题
给定两个单链表 headA
和 headB
,寻找并返回这两个单链表的第一个相交节点。如果两个链表没有交点,则返回 null
。图示两个链表在节点 c1
开始相交,并给出图解。
代码实现
/**
* 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 lenA = getLength(headA);
int lenB = getLength(headB);
// 调整链表,使较长的链表先走
if (lenA > lenB) {
int diff = lenA - lenB;
while (diff--) {
headA = headA->next;
}
} else if (lenB > lenA) {
int diff = lenB - lenA;
while (diff--) {
headB = headB->next;
}
}
// 同时遍历两个链表,直到找到相交节点
while (headA != NULL && headB != NULL) {
if (headA == headB) {
return headA;
}
headA = headA->next;
headB = headB->next;
}
// 如果没有找到相交节点,则返回 null
return NULL;
}
private:
int getLength(ListNode *head) {
int len = 0;
while (head != NULL) {
len++;
head = head->next;
}
return len;
}
};
时间复杂度和空间复杂度分析
- 时间复杂度:O(m + n),其中 m 和 n 分别是两个链表的长度。
- 空间复杂度:O(1),因为算法不需要额外的空间。
相关参考
结语
相交链表问题是链表数据结构中一个经典的问题,经常出现在编程面试和算法竞赛中。理解并掌握相交链表问题的解法,可以帮助您提高编程技能和算法思维。在本文中,我们介绍了相交链表问题的详细解法,包括了代码实现、时间复杂度和空间复杂度分析以及相关参考链接。希望本文能够对您有所帮助。