【问题标题】:How to get an intersection of two linked lists?如何获得两个链表的交集?
【发布时间】:2021-10-06 15:14:16
【问题描述】:

嗨,我正在学习数据结构和算法,并从 leetcode 练习问题 我遇到了question,我尝试理解它,但我无法理解它。 在 example1 中有两个链表 在哪里

listA = [4,1,8,4,5]
listB = [5,6,1,8,4,5] 

那为什么这两个链表的交点是8呢?而不是1? 因为我假设是两个列表相同的点,是交点。

因为在 example2 中有 2 个列表

listA = [1,9,1,2,4]
listB = [3,2,4] 

这里的交点是'2'。因为列表从 '2' 开始变得相同

请解释一下这个交集的概念。

谢谢

【问题讨论】:

  • listA = [4,1,8,4,5] listB = [5,6,1,8,4,5]not 输入,提供的 picture 是输入。值相同没关系,你需要看图。

标签: c++ algorithm data-structures singly-linked-list


【解决方案1】:

伙计,你需要检查指针,如果两个链表中有相同的指针,那就是交点。这些数字只是告诉节点包含的值。显然,交叉节点将具有相同的值,但相同值的节点可能不是交叉点。检查示例中的图表。另请注意,代码中的输入不仅仅是数字列表,它们是指针。所以使用指针。

【讨论】:

  • 如何在代码中生成这样的链表?我正在使用 STL,即 std::forward_list 来表示单链表。我知道可以手动创建每个节点,然后执行 list.insert_after() 以便我们以后可以比较节点的地址。但是,是否有可能完全/部分地使用一些 forward_list API 来生成第二个列表来共享同一个节点,同时创建自己?例如:listTwo.insert_after(listTwo.begin(), std::next(listOne.begin(), 3), listOne.end());创建新节点,而不是共享现有节点。我们可以共享节点吗?
【解决方案2】:

在那个问题中,我们必须找到 List 具有相同节点(引用和值)而不是唯一值的交点。

示例 - 1:

这里,值为 8 的节点是第一个在两个列表中具有相同引用和值的节点。之后,所有节点都具有相同的值和引用。而值为 1 的节点是单独的节点。


示例 - 2:

这里值 2 的节点在两个列​​表中具有相同的引用和值。之后,所有节点都具有相同的值和引用。

【讨论】:

    【解决方案3】:

    见下图:

    链表AB 具有相同值的节点(例如,值为 1 的节点)但它们实际上是两个不同的节点。交叉点从 node 开始,值为 8。

    交集是指具有相同节点的链表。这并不意味着它们具有相同值的不同节点。

    要检查交叉点,您不能依赖具有相同值的节点。它们应该是同一个节点(具有相同地址的节点)。

    算法是先求两个链表的长度。通过两个链表的长度差来移动较大的链表头。然后,检查节点是否实际上等于address(不仅仅是值)。

    见我的Solution:

    class Solution:
        @staticmethod
        def get_length(h):
            ln = 0
            while h:
                ln += 1
                h = h.next
            return ln
    
        def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
            l1 = Solution.get_length(headA)
            l2 = Solution.get_length(headB)
    
            print(l1, l2)
            lg = headA if l1 > l2 else headB
            sr = headA if l1 <= l2 else headB
    
            for _ in range(abs(l2 - l1)):
                lg = lg.next
    
            while lg and sr:
                if lg == sr:
                    return lg
                lg = lg.next
                sr = sr.next
    
            return None
    

    【讨论】:

    • OP 没有;现在不要求代码。让他理解并尝试自己!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    相关资源
    最近更新 更多