查找两个链表的第一个共同元素的Python程序

查找两个链表的第一个共同元素的Python程序

问题描述

给定两个单向链表,如何找到它们的第一个共同元素?

解题思路

可以使用双指针的方法,先遍历第一个链表,然后遍历第二个链表,如果遇到相同元素,则返回该元素。若遍历完两个链表都没有遇到相同元素,则返回 None。

具体实现可以用 Python 实现。首先,我们定义链表节点的类:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

然后,我们定义一个函数来查找两个链表的第一个共同元素:

def getIntersectionNode(headA: ListNode, headB: ListNode) -> ListNode:
    pA, pB = headA, headB
    while pA != pB:
        pA = pA.next if pA else headB 
        pB = pB.next if pB else headA
    return pA

我们来分析一下这段代码的实现。

  • 首先,我们定义两个指针 pA 和 pB,分别指向两个链表的头结点;
  • 然后,我们遍历两个链表,如果遇到相同元素,则返回该元素;
  • 如果遍历完两个链表都没有遇到相同元素,则返回 None。

代码实现

下面是完整的代码实现。注意:示例中使用了多个链表节点,这些节点的值都是随机生成的。

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

def getIntersectionNode(headA: ListNode, headB: ListNode) -> ListNode:
    pA, pB = headA, headB
    while pA != pB:
        pA = pA.next if pA else headB 
        pB = pB.next if pB else headA
    return pA


# 示例代码:

# 创建链表 a: 1->2->3->4->5
a = ListNode(1)
a.next = ListNode(2)
a.next.next = ListNode(3)
a.next.next.next = ListNode(4)
a.next.next.next.next = ListNode(5)

# 创建链表 b: 6->5->4->3->2->1
b = ListNode(6)
b.next = ListNode(5)
b.next.next = ListNode(4)
b.next.next.next = ListNode(3)
b.next.next.next.next = ListNode(2)
b.next.next.next.next.next = ListNode(1)

# 创建链表 c: 7->8->9
c = ListNode(7)
c.next = ListNode(8)
c.next.next = ListNode(9)

# 链表 a 和链表 b 的第一个共同元素是 5
a.next.next.next.next.next = b.next.next.next.next.next # 将 a 和 b 相交,指向的公共元素是 5
assert getIntersectionNode(a, b).val == 5

# 链表 a 和链表 c 没有共同元素
assert getIntersectionNode(a, c) == None

结论

通过双指针的方法,我们可以很容易地找到两个单向链表的第一个共同元素。该方法时间复杂度为 O(m+n),其中 m 和 n 分别表示两个链表的长度,空间复杂度为 O(1)。

完整代码:https://github.com/Aiur1070/shared-documents/blob/main/python/find_intersection_of_two_linked_lists.py

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程