将给定的单链表L:L0→L1→L2→…→Ln-2→Ln-1→Ln 重新排序为:L0→Ln→L1→Ln-1→L2→Ln-2→… 要求使用原地算法,不能只改变节点内部的值,需要对实际的节点进行交换。 数据范围:链表长度 0≤n≤20000 ,链表中每个节点的值满足 0≤val≤1000。 示例1 输入:{1,2,3,4} 返回值:{1,4,2,3} 说明:给定head链表1->2->3->4, 重新排列为 1->4->2->3,会取head链表里面的值打印输出 示例2 输入:{1,2,3,4,5} 返回值:{1,5,2,4,3} 说明:给定head链表1->2->3->4->5, 重新排列为 1->5>2->4->3,会取head链表里面的值打印输出
时间: 2024-02-12 18:04:21 浏览: 209
好的,这是一个链表问题,可以使用快慢指针和链表反转的思想来解决。
具体思路如下:
1. 使用快慢指针找出链表的中点,将链表分成两个部分。
2. 将后半部分链表反转。
3. 将前半部分链表和反转后的后半部分链表交替合并。
实现代码如下:
```python
class Solution(object):
def reorderList(self , head ):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head or not head.next:
return head
# 使用快慢指针找出链表的中点
slow, fast = head, head.next
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 将后半部分链表反转
p = slow.next
slow.next = None
pre = None
while p:
nxt = p.next
p.next = pre
pre = p
p = nxt
# 将前半部分链表和反转后的后半部分链表交替合并
p = head
while pre:
nxt = p.next
p.next = pre
pre = pre.next
p.next.next = nxt
p = nxt
return head
```
时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。
阅读全文