📅  最后修改于: 2023-12-03 15:41:19.197000             🧑  作者: Mango
在链表中,有时候两个链表会有一段公共的部分,我们称之为交点。在这个问题中,我们需要编写一个函数来获取两个链表的交点。其中,这两个链表可能为空或者没有交点。
利用哈希表保存一个链表的节点,然后遍历另一个链表的节点,如果在哈希表中找到对应的节点,那么就说明这是两个链表的交点。时间复杂度为O(m+n),空间复杂度为O(m)或O(n),其中m、n分别为两个链表的长度。
Python代码:
def getIntersectionNode(headA: ListNode, headB: ListNode) -> ListNode:
nodes = set()
while headA:
nodes.add(headA)
headA = headA.next
while headB:
if headB in nodes:
return headB
headB = headB.next
return None
C++代码:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
unordered_set<ListNode *> nodes;
while (headA) {
nodes.insert(headA);
headA = headA->next;
}
while (headB) {
if (nodes.count(headB)) {
return headB;
}
headB = headB->next;
}
return nullptr;
}
利用双指针,分别遍历两个链表,如果某一个链表到达了末尾,那么就从另一个链表的头节点开始遍历,直到两个指针相遇,这就是两个链表的交点。时间复杂度为O(m+n),空间复杂度为O(1),其中m、n分别为两个链表的长度。
Python代码:
def getIntersectionNode(headA: ListNode, headB: ListNode) -> ListNode:
if not headA or not headB:
return None
pA, pB = headA, headB
while pA != pB:
pA = pA.next if pA else headB
pB = pB.next if pB else headA
return pA
C++代码:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) {
return nullptr;
}
ListNode *pA = headA, *pB = headB;
while (pA != pB) {
pA = pA ? pA->next : headB;
pB = pB ? pB->next : headA;
}
return pA;
}
以上是获取两个链表的交点的两种解法,其中解法一需要额外的空间来存储哈希表,而解法二则不需要额外的空间,只需要用到指针来遍历链表。两种解法的时间复杂度都是O(m+n),其中m、n分别为两个链表的长度,但是解法二的空间复杂度更小,是O(1)。在实际应用中,可以根据具体情况来选择合适的解法。