【问题标题】:Intersection of two linked lists两个链表的交集
【发布时间】:2010-01-31 11:14:58
【问题描述】:

给定两个排序链表 L1 和 L2,计算它们的解 路口L1路口L2

【问题讨论】:

  • SO 的目的是灌输知识和理解,而不是给你模糊问题的完整解决方案。

标签: c algorithm data-structures


【解决方案1】:
L1_node = L1.head;
L2_node = L2.head;
Result = new SList;
while L1_node != NULL and L2_node != NULL:
  if L1_node.value == L2_node.value:
     Result.append(L1_node.value)
     L1_node = L1_node.next
     L2_node = L2_node.next
  elif L1_node.value < L2_node.value:
     L1_node = L1_node.next
  else
     L2_node = L2_node.next

(自己翻译成C。)

【讨论】:

  • 其中有一个错误。在 == 情况下,您不会跳过任何内容 - 您将获得无限系列的 L1_node.value。
  • 也许它是作为 OP 调试的练习而留下的?如果我要雇用某人,并提出这个确切的面试问题,并得到这个确切的解决方案,如果他只是模仿他在网上找到的答案,我会质疑他开始作为程序员工作的动机。
  • @Lasse - 也许,而且不是一个坏主意。我在下面的错误是故意的,诚实的。
  • 当涉及到 Stack Overflow 上的家庭作业和面试问题时,我的直觉反应是尝试引导这个人朝着正确的方向前进,而不是仅仅将答案抛给他。当您招聘程序员时,您需要能够思考、学习和应用的人,而不是能够使用复制/粘贴的人。好吧,复制/粘贴的专业知识是一个奖励。
  • @KennyTM - 这就是重点。您假设非唯一输入应导致非唯一输出。交集是一个集合操作,这意味着它可能不正确 - 集合具有唯一值,因此 [2, 2, 4] 不是集合。我自己的解决方案(对联合)假设输出应该是一个集合,但可以容忍非唯一的输入——仍然产生一个唯一的集合作为输出。我对一个未说明的要求做了一个假设,但对你的猜测却不同——看到你的代码有不同的假设,这让我意识到所需的输出并没有明确定义。
【解决方案2】:

由于它们是单链表,如果两个链表相交,它们将形成一个 Y 形,其中一条臂长或等于另一条臂。令 l1 为 L1 列表的长度,l2 为 L2 列表的长度。

假设 l1 > l2。 从点 (l1-l2) 开始匹配 List L1 的指针,并从 L2 的开头开始匹配它们指向的相同节点,该节点将成为匹配点。

如果 l2 大于 l1 则执行其他方式。

【讨论】:

    【解决方案3】:

    下面的解决方案怎么样,它是 O(n+m) 并且需要一个指向 Head 节点的虚拟节点。 Head 节点在这里是一个类级别的变量,所以即使 L1 指向当前,Head 总是有完整的列表。

    我已经编译和测试,对于 L1: 1->5>6>7>8>10 和 L2:2>4>6>8 等简单输入运行良好,输出为 6>8

    关于如何使用未排序列表的任何想法?我想不出一个 O(n) 的解决方案

    public Node ReturnIntersection(Node Head, Node L2) { if ((Head == null) || (L2 == null)) return null;

         Node temp = null;
          Node L1 = Head;
    
    
          while (L1.next != null && L2.next != null)
          {
              if (L1.data == L2.data)
              {
                  L1 = L1.next;
                  L2 = L2.next;
              }
    
              else if (L1.data < L2.data)
              {
                  temp = L1.next;
                  L1.data = temp.data;
                  L1.next = temp.next;
    
              }
    
              else if (L1.data > L2.data)
              {
                  L2 = L2.next;
    
              }
    
          }
    
          if (L1 != null)
          {
              while (L1.next != null)
              {
                  L1.next = null;
    
              }
          }
          return Head;
    
    
      }
    

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      相关资源
      最近更新 更多