【问题标题】:Data structures linked list数据结构链表
【发布时间】:2017-07-05 20:30:10
【问题描述】:

我被要求解决这个问题:

有两个单链表。 我需要编写一个方法来获取这两个链表并返回一个指向起点的指针,该起点的后缀在这两个链表中是相同的。

例子:

给定:

1->2->4->6->8->10->15
2->4->8->10->15

返回值将是一个指向成员的指针 - 8。

但是, 我需要在不更改列表或使用更多内存的情况下这样做, 并且 - 我们只需要扫描一次列表,即T(n)=O(n)

【问题讨论】:

  • 这绝对看起来像是一个家庭作业问题。 Stack Overflow 不会为您做作业。写一些代码,试着让它工作,然后当你遇到特定问题时寻求帮助。
  • 你用什么编程语言编写代码?
  • 列表是否保证排序?
  • 在你的例子中,它应该返回 2 对吗?怎么会是 8 点?
  • 首先 - 这不是我的作业.. 我今天只是帮我的女朋友准备她的考试...

标签: algorithm performance data-structures linked-list big-o


【解决方案1】:
  1. 测量两个列表的长度
  2. 在较长的列表中向前跳,直到它们的长度相同
  3. 按步骤向前遍历两个列表,并记住列表具有不同元素的最后一个点之后的节点。这些是您可以返回的指针。

现在...我知道你说你只想扫描列表一次,我已经做了两次,但是你说这意味着 T(n) = O(n),这是正确的。

扫描列表两次也是O(n) 并且需要在不使用无限额外内存的情况下解决问题。

【讨论】:

  • 这将需要至少两次遍历列表。
  • @wildpasser 如上所述,它恰好需要两次遍历——遍历每个要测量的列表一次,然后遍历 (2) 和 (3) 中的每个项目。
【解决方案2】:

这是一个伪代码.. 不是 Python 代码 取这两个列表,让 p1 指向更长的列表, p2 指向更短的列表,

while p1->next!=NULL:
   if p1->value = p2->value:
      p1 = p1->next
      p2 = p2->next
   else:
      p1 = p1->next
      returnpointer = p1->next// if it happens that some elements are same towards end but not the last element.. p1->next would be pointing to NULL anyways and else.. it'll always be the element next to the last element which wasn't same
return returnpointer

【讨论】: