【问题标题】:Reverse and merge a linked list反转和合并链表
【发布时间】:2013-02-03 17:05:32
【问题描述】:

问题:给定一个排序的链表

1->2->3->4->5->6->7

更改链表中的指针使其成为可能

7->1->6->2->5->3->4

使用常量空间。

我尝试使用以下算法解决它:

  1. 使用 2 个节点,一个快速节点和一个慢速节点来查找链表的中间节点。
  2. 从中间节点反转链表。将中间节点标记为y,开始节点标记为x。

    1->2->3->7->6->5->4
    x        y
    
  3. 如果 y=middle node AND y!= x.next,则交换 y 和 x.next。然后交换 x 和 x.next。

    1->7->3->2->6->5->4
    x        y
    7->1->3->2->6->5->4
    x        y
    

    将 x 前进 2 个节点,将 y 前进 1 个节点。

    7->1->3->2->6->5->4
          x     y     
    
  4. 现在 if (x != y) { 交换 x 和 y }

    7->1->6->2->3->5->4
          x     y
    
  5. x 前进两个节点,y 前进 1 个节点

    7->1->3->2->6->5->4
                x  y
    
  6. 重复第 4 步和第 5 步,直到 y 变为空(到达链表末尾)或 x == y

所以我们终于得到了

7->1->6->2->5->3->4

问题:

有没有更简单的方法来做到这一点?

【问题讨论】:

    标签: algorithm data-structures linked-list


    【解决方案1】:

    这是一个简单的解决方案:

    1. 找到列表大小。
    2. 由 2 个相同的列表拆分。
    3. 反转第二部分。
    4. 合并列表。

    示例:

    1. 1->2->3->4->5->6->7 大小为 7。 (我们应该除以 4 和 3)
    2. 1->2->3->45->6->7 拆分
    3. 反转第二部分1->2->3->47->6->5
    4. 合并:7->1->6->2->5->3->4

    【讨论】:

    • 第二个列表中的 1 个,第一个列表中的 1 个,第二个列表中的 1 个等等。
    • 需求是使用常量空间;分别合并这两个列表需要一个单独的输出列表。我正在尝试更改原始列表中的指针以获得输出..
    • 合并不需要额外的空间,只需将链接修改为节点即可。
    【解决方案2】:

    您可以在Linked list problem 问题 17 和 18 中找到两个复杂的解决方案。

    【讨论】:

    • 感谢您的链接,但我确实知道如何反转链接列表。我是专门问这个问题的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2021-05-21
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多