【问题标题】:Sorting a linked list with alternate elements sorted and reverse sorted使用已排序和反向排序的备用元素对链表进行排序
【发布时间】:2012-05-09 10:42:00
【问题描述】:

我在一次采访中被问到这个问题。

列表如下所示。

a1->bn->a2->bn-1 ... ->an->b1->NULL

这样, a12 n

b12 n

面试官对我施加了以下限制:

  1. 您必须对列表进行适当的排序,即您不允许 将一组元素中的替代元素移除到一个单独的 列表。
  2. 您必须以某种方式利用列表中的模式而不是简单的排序算法。

我在面试期间无法想出解决方案,现在也是。 :-(

编辑:用 C 编写代码来对这个单链表进行排序。

Edit2:有人告诉我,我可以从冒泡排序中借鉴一些想法并利用该模式。但它不应该是一个“幼稚”的短片。

我讨厌面试官施加人为限制,但嘿,工作就是工作:-)

【问题讨论】:

  • 那么,想要的结果是什么?是否对整个列表进行排序,而不区分 ab 元素?
  • 编辑问题以解决 cmets
  • @Saurabh 你还没有解决我的问题。期望的输出是什么?
  • 我有。问题已经得到解答:您必须对列表进行适当的排序,
  • @Saurabh 实际上,没有。您所说的只是列表应该“排序”。您尚未指定这是否意味着 ab 节点之间应该没有区别。

标签: algorithm sorting data-structures linked-list


【解决方案1】:

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

  • 通过调整列表中的“下一个”指针,创建两个列表。一个包含 a,另一个包含 b,颠倒过来。
  • 合并这两个列表。

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

我无法立即想到如何将这两个步骤组合成一个步骤。

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

【讨论】:

  • 史蒂夫,这也是我对这个问题的第一反应,但根据面试官的说法,这是一个要求。
  • @Saurabh:好吧,如果您不允许重新链接节点,那么链表就像一个没有随机访问的数组。所以解决方案将与数组相同,但可能更慢。
  • 我想这就是他的意思。我会接受你的回答。 Jeesh 我现在很尴尬:D
  • 我认为进一步的改进是首先对反向排序的备用元素进行排序。然后合并两个排序好的列表。
  • @Saurabh:提到冒泡排序让我想起了冒泡排序是访问模式的最佳排序,在这种访问模式中,您可以通过一个小窗口看到内存,该小窗口向前而不是向后跟踪,然后重新开始开始(转鼓存储)。单链表就是这样,往前走很便宜,往后走就得从头开始。我还没有想到一种方法来优化这个输入数据的冒泡排序。
【解决方案2】:

为了保持“原地”,可以先将列表原地转换为

a1 -> ... -> an -> b1 -> ... -> b n

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

在此之后,您可以以“冒泡排序方式”将 a 元素一个接一个地向前移动,即向前扫描,直到在最初位于 b1 之前的边界之后找到它们的位置。

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

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 2017-09-27
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多