给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
根据题目的描述和给的示例可以看出,链表重排后的形式为链表的右半部分反转后的结果中的元素依次插入链表的左半部分。因此,解决该问题可以分为以下几步进行
- 获取链表的左右两个部分,并实现右半部分链表的反转
- 将反转后结果中的元素依次插入到左半部分
AC code
class Solution:
def reorderList(self, head: ListNode) -> None:
"""
Do not return anything, modify head in-place instead.
"""
if not head: return None
# 获取链表长度
l = 0
cur = head
while cur:
l += 1
cur = cur.next
mid = l // 2
cur = head
index = 0
# 获取左链表
while cur and index < mid - 1:
index += 1
cur = cur.next
# 获取右链表
t = cur.next
cur.next = None
# 右链表反转
right = None
while t:
node = ListNode(t.val)
node.next = right
right = node
t = t.next
l, r = head, right
while l.next and r:
node = ListNode(r.val)
node.next = l.next
l.next = node
l = l.next.next
r = r.next
if r:
l.next = r