反转并合并链表

时间:2013-02-19 05:18:34

标签: algorithm data-structures linked-list

问题:给定排序链表

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 =中间节点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推进两个节点,y推进1个节点。

    7->1->3->2->6->5->4
          x     y     
    
  4. 现在如果(x!= y){swap 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. 最后我们得到了

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

    问题:

    有更简单的方法吗?

2 个答案:

答案 0 :(得分:2)

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

  1. 找到列表大小。
  2. 由2个相同的列表填写。
  3. 反向第二部分。
  4. 合并列表。
  5. 样品:

    1. 1->2->3->4->5->6->7尺寸为7。 (我们应该分为4和3)
    2. 1->2->3->45->6->7
    3. 分组
    4. 反向第二部分1->2->3->47->6->5
    5. 合并:7->1->6->2->5->3->4

答案 1 :(得分:0)

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