遇见未来. 2021-06-05 20:51 采纳率: 33.3%
浏览 23

请求大佬帮助 题目:将两个已排序的链表求交集。 思路:遍历L1把L1中与L2相同的保留下来,不同的删

请求大佬帮助 题目:将两个已排序的链表求交集。 思路:遍历L1把L1中与L2相同的保留下来,不同的删掉。 问题:在调用删除某一指定节点时把前面的遍历过的节点一起删了
  • 写回答

1条回答 默认 最新

  • Shero.李建业 2024-05-09 18:07
    关注

    在解决这个问题时,直接遍历并删除链表中的节点不是一个理想的策略,因为这会改变链表的结构,使得遍历变得复杂且容易出错。对于两个已排序的链表求交集,更高效且简单的方法是采用双指针法。以下是具体的步骤和思路:

    思路改进:

    1. 初始化双指针:首先,创建两个指针 p1p2 分别指向两个链表 L1L2 的头部。

    2. 遍历比较:然后,同时遍历两个链表。如果 p1p2 指向的节点值相等,则说明当前节点是交集的一部分,将其加入到结果链表中(或者直接返回,取决于你的具体实现需求),然后 p1p2 都向前移动一步。如果值不相等,值较小的指针向前移动一步。

    3. 终止条件:当任意一个指针到达链表尾部时,停止遍历。

    伪代码:

    def getIntersectionNode(L1, L2):
        p1, p2 = L1, L2
        
        # 遍历直到两个指针相遇
        while p1 != p2:
            # 如果p1到达链表尾部,则转向L2的头开始遍历
            if not p1:
                p1 = L2
            else:
                p1 = p1.next
            
            # 如果p2到达链表尾部,则转向L1的头开始遍历
            if not p2:
                p2 = L1
            else:
                p2 = p2.next
                
        # 当两个指针相遇时,即为第一个公共节点,或者都为空表示无交集
        return p1
    

    这个方法实际上是利用了两个链表已经排序的特点,通过“走完一个链表再从另一个链表头开始走”的方式,保证了两个指针最终会在第一个公共节点相遇,或者在两个链表都遍历完的情况下确认无交集。

    注意:

    上述伪代码主要用于寻找两个链表的第一个交点。如果你的目标是获取整个交集部分,可以在找到第一个交点后,继续遍历两个链表,直到任一指针到达末尾,期间收集相同节点即可。

    评论

报告相同问题?