使用排序和反向排序的备用元素对链表进行排序

时间:2012-05-09 10:42:00

标签: algorithm sorting data-structures linked-list

我在接受采访时被问到这个问题。

列表看起来像这样。

一个<子> 1 - &GT,B <子>名词 - &gt;一种<子> 2 - &GT,B <子> N-1 ... - &gt; a n - &gt; b 1 - &gt; NULL

这样, a 1 &lt; a 2 &lt; ......&lt;一个<子>名词

b 1 &lt; b 2 &lt; ......&lt; B'的子>名词

面试官对我施加了以下约束:

  1. 您必须对列表进行排序,即您不被允许 将一组元素的替代元素移到单独的元素中 名单。
  2. 你必须以某种方式利用列表中的模式,而不是一个天真的排序算法。
  3. 在面试中我无法提出解决方案,现在也是如此。 : - (

    编辑:用C编写代码以对此单链表进行排序。

    Edit2:我还告诉我,我可以从冒泡中借鉴一些想法,并利用这种模式。但它不应该是一个“天真”的短片。

    我讨厌面试官提出人为约束但是嘿工作是一份工作: - )

2 个答案:

答案 0 :(得分:2)

“你必须对列表进行排序”这个要求让我感到困惑。我原以为自然解决方案是:

  • 通过跳转列表中的“下一个”指针,创建两个列表。一个包含a,另一个包含b,反转。
  • 对这两个列表进行合并。

但我不确定第一步是否违反规则。正如我所理解的那样,它 “就地”,因为它不会复制节点或它们的数据,实际上它也不会移动任何数据。但它 将备用元素删除到单独的列表中。

我无法立即想到如何将这两个步骤合并为一个通道。

[编辑:可能“就地”这里意味着我们应该移动数据,而不是重新链接列表。在这种情况下,我认为问题更难:高效的就地合并排序在数组中足够痛苦,而不是尝试(a)在链表上,(b)使用错误顺序的替代元素]

答案 1 :(得分:0)

为了使其保持“就位”,您可以先将原因列表转换为

a 1 - &gt; ... - &gt; a n - &gt; b 1 - &gt; ... - &gt; B'的子>名词

遍历列表并逐个将b元素移动到列表末尾。

然后,您可以以“气泡排序方式”逐个向前移动元素,即向前扫描,直到您找到位于b 1 之前的边界之后的位置。

但我同意这个问题相当人为。