我在接受采访时被问到这个问题。
列表看起来像这样。
一个<子> 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'的子>名词子>
面试官对我施加了以下约束:
在面试中我无法提出解决方案,现在也是如此。 : - (
编辑:用C编写代码以对此单链表进行排序。
Edit2:我还告诉我,我可以从冒泡中借鉴一些想法,并利用这种模式。但它不应该是一个“天真”的短片。
我讨厌面试官提出人为约束但是嘿工作是一份工作: - )
答案 0 :(得分:2)
“你必须对列表进行排序”这个要求让我感到困惑。我原以为自然解决方案是:
但我不确定第一步是否违反规则。正如我所理解的那样,它 “就地”,因为它不会复制节点或它们的数据,实际上它也不会移动任何数据。但它 将备用元素删除到单独的列表中。
我无法立即想到如何将这两个步骤合并为一个通道。
[编辑:可能“就地”这里意味着我们应该移动数据,而不是重新链接列表。在这种情况下,我认为问题更难:高效的就地合并排序在数组中足够痛苦,而不是尝试(a)在链表上,(b)使用错误顺序的替代元素]
答案 1 :(得分:0)
为了使其保持“就位”,您可以先将原因列表转换为
a 1 - &gt; ... - &gt; a n - &gt; b 1 - &gt; ... - &gt; B'的子>名词子>
遍历列表并逐个将b元素移动到列表末尾。
然后,您可以以“气泡排序方式”逐个向前移动元素,即向前扫描,直到您找到位于b 1 之前的边界之后的位置。
但我同意这个问题相当人为。