📜  编写函数以获取两个链表的交点|套装2(1)

📅  最后修改于: 2023-12-03 15:41:19.197000             🧑  作者: Mango

编写函数以获取两个链表的交点|套装2

在链表中,有时候两个链表会有一段公共的部分,我们称之为交点。在这个问题中,我们需要编写一个函数来获取两个链表的交点。其中,这两个链表可能为空或者没有交点。

解法一

思路

利用哈希表保存一个链表的节点,然后遍历另一个链表的节点,如果在哈希表中找到对应的节点,那么就说明这是两个链表的交点。时间复杂度为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)。在实际应用中,可以根据具体情况来选择合适的解法。