【问题标题】:How to get the common elements of the two sets in a Linked List?如何在链表中获取两个集合的共同元素?
【发布时间】:2012-03-22 00:03:32
【问题描述】:

我有 2 个链表,我想比较两个列表并打印两个列表中出现的每个常见元素。尝试了一切都无法让它工作。

struct Node *calcIntersection(struct Node *headA, struct Node *headB)
{

 struct Node * link1 = headA;

 struct Node * link2 = headB;

 while(link1 != NULL)
 {

  if (link2->value == link2->value)
     {

      printf("%d", link1->value);

     }      

    link1 = link1 -> pNext;

 }

  return link1;

}

【问题讨论】:

  • 这是作业吗?如果是这样,请标记它。
  • 不是功课,试着自学算法和数据结构。
  • 当比较一个集合中的每个项目时,与另一个集合中的每个项目必须有两个循环(某处), 不是一个。所以它至少有一半。
  • 列表是否已排序?列表之一是否已排序?您是否可以对它们进行排序(或更改)?如果列表包含重复项会发生什么情况,在这种情况下您是否需要(部分)笛卡尔积?
  • 列表没有排序,不介意是否排序,只是尝试找到从两个集合中获取公共元素的最佳方法。

标签: c


【解决方案1】:

你很接近,实际上你的方法应该是这样的:

struct Node *calcIntersection(struct Node *headA, struct Node *headB)
{
    struct Node *link1 = headA;

    while(link1 != NULL)
    {
        struct Node *link2 = headB;

        while (link2 != NULL)
        {
            if (link1->value == link2->value)
            {
              printf("%d", link1->value);
            }      

            link2 = link2->pNext;
        }

        link1 = link1->pNext;
    }

   return link1;
}

我不太确定你在那里返回什么,但在大多数情况下你会返回 NULL,但我不太确定这是否是你想要的。

【讨论】:

  • 这不是一个正确的解决方案,因为两个指针同时前进。它只逐个元素比较。它因 [1, 2, 3], [2, 1, 3] 之类的东西而失败
  • 我看到你编辑了你的答案。我指出的错误不再适用。还需要注意的是,使用这种方法必然会打印出重复的值。
  • 谢谢它现在工作了,返回是支持返回共同值。如果两个集合都有超过 1 个共同元素,我是否只需编写另一个 while 循环来检查第二个集合?
  • 这种方法的复杂度为 O(n^2)。如果先对列表进行排序,则可以将其改进为 O(n log n)。
【解决方案2】:

好的..这看起来像家庭作业..所以我会指出一些在上面的代码中非常明显的事情

1) 您正在检查的条件 (link2->value == link2->value) 可能是拼写错误。您的意思可能是 link2->value == link1->value。
2)您正在迭代列表 1 中的每个元素,但不在列表 2 中。因此,您只检查列表 2 中的第一个元素是否在列表 1 中找到。

我认为这已经足够了.. 现在.. :)

【讨论】:

    【解决方案3】:
    if (link2->value == link2->value)
    

    应该是

    if (link1->value == link2->value)
    

    正如 gbulmer 所指出的,您还应该遍历第二个列表并将其与第一个列表进行比较。

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      • 2012-12-04
      • 2021-12-08
      相关资源
      最近更新 更多