重排链表
Last updated
Last updated
问题简述
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路:模拟
先找到中间节点 mid;
将链表 mid 反转;
然后合并 head 和 mid;
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reorderList(self, head: ListNode) -> None:
"""
Do not return anything, modify head in-place instead.
"""
if not head: return
def get_mid(p):
lp, fp = p, p
while fp and fp.next:
lp = lp.next
fp = fp.next.next
return lp
def reverse(p):
cur, pre = p, None
while cur:
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
return pre
mid = get_mid(head) # 注意此时还没有断开两个链表
mid = reverse(mid)
# merge
l, r = head, mid
while True:
l_nxt, r_nxt = l.next, r.next
if not r_nxt: # 这是一种写法,另一种写法是在获得 mid 后将 mid 与原链表断开(后移一个节点,结果也是正确的,见写法2)
break
l.next, r.next = r, l_nxt
l, r = l_nxt, r_nxt