每日一道leetcode(python)143. 重排链表

每日一道leetcode(python)143. 重排链表

2021-08-07

给定一个单链表 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 * 104]
1 <= node.val <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  • 先找到链表的中点:快慢指针,考虑节点个数奇偶情况
  • 再翻转后半段链表
  • 最后两链表依次插入
# 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.
        """
        fast = slow = a = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
        b = slow.next if fast else slow

        pre = None
        cur = b
        while cur:
            hl = cur.next
            cur.next = pre
            pre = cur
            cur = hl
            
        b = pre
        while a:
            a.next, b = b, a.next
            a = a.next
        return head

你可能感兴趣的:(每日一道leetcode)