143. 重排链表

87 阅读1分钟

143. 重排链表

给定一个单链表 L **的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

 

示例 1:

输入: head = [1,2,3,4]
输出: [1,4,2,3]

示例 2:

输入: head = [1,2,3,4,5]
输出: [1,5,2,4,3]

 

提示:

  • 链表的长度范围为 [1, 5 * 10^4]
  • 1 <= node.val <= 1000

学习灵神的基础算法

Snipaste_2023-11-28_21-42-38.png

代码

用到了之前
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

def reorderList(self, head: Optional[ListNode]) -> None:
    # 就是先把中间节点到末尾这一段反转,然后再先原链表再反转后的一个一个交叉连接起来
    # 876. 链表的中间结点
    def middleNode(head):
        # 使用快慢指针,慢指针每次1步,快指针每次2步
        # 如果奇数个节点,那么fast 到达最后1个节点时候,fast.next = None,slow正好在正中
        # 如果偶数个节点,那么fast达到最后一个节点之后的位置,fast = none,slow正好在中间第二个节点
        slow = fast = head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        return slow

    # 206.反转链表
    def reverseList(head) :
        #借助三个指针pre、cur、nxt
        pre = None
        cur = head
        while cur:
            nxt = cur.next
            cur.next = pre
            pre = cur
            cur = nxt
        return pre

    mid = middleNode(head)
    head2 = reverseList(mid) # 第二段反转链表的头结点

    while head2.next:
        # 直到第二段没了,第二段等于或长一点
        t1 = head.next # 记录2个head的下一个位置
        t2 = head2.next
        head2.next = head.next
        head.next = head2
        head = t1
        head2 = t2