问题:给定一个排序的链表
1->2->3->4->5->6->7
改变链表中的指针使其成为
7->1->6->2->5->3->4
使用常量空间。
我尝试使用以下算法解决它:
- 使用 2 个节点(一个快节点和一个慢节点)找到链表的中间节点。
从中间节点开始反转链表。标记中间节点为y,起始节点为x。
1->2->3->7->6->5->4 x y
如果 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 推进两个节点,将 y 推进 1 个节点。
7->1->3->2->6->5->4 x y
现在 if (x != y) { 交换 x 和 y }
7->1->6->2->3->5->4 x y
将 x 推进两个节点,将 y 推进 1 个节点
7->1->3->2->6->5->4 x y
- 重复第 4 步和第 5 步,直到 y 变为 null(到达链表末尾)或 x == y
最后我们得到
7->1->6->2->5->3->4
问题:
有没有更简单的方法来做到这一点?
最佳答案
这是一个简单的解决方案:
- 找到列表大小。
- 由 2 个相同的列表拆分。
- 反转第二部分。
- 合并列表。
示例:
1->2->3->4->5->6->7
大小为7
。 (我们应该分成 4 和 3)- 拆分为
1->2->3->4
和5->6->7
- 反转第二部分
1->2->3->4
和7->6->5
- 合并:
7->1->6->2->5->3->4
关于algorithm - 反转并合并链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14950338/