力扣刷题TOP101:12.BM14 链表的奇偶重排

目录:

目的

思路

复杂度

记忆秘诀

python代码

目的

1->2->3->4->5->6->NULL 重排后为 1->3->5->2->4->6->NULL


思路

这个任务是将原链表的奇数下标全部排在偶数下标前面。这个操作很像两个top中学争夺生源,为了公平最后通过奇偶排名来分配(在我以前的高中就是这样)。 把所有学生的中考成绩排名重新排列,奇数排名排在前面给第一家学校,偶数排在后面给第二家学校,学生信息保持不变。


学校准备

  • 奇才学府校长 odd,从名单的第1个学生(head)开始负责奇数名次的分配。
  • 偶秀学院校长even,从名单的第2个学生(head.next)开始负责偶数名次的分配。
  • 为了方便最终排列,偶秀学院的校长还专门记下了自己第一个学生的名字(even_head)。

分配学生:两位校长交替工作

  • 奇才学府校长:负责奇数名次的学生,把当前奇数名次的学生直接跳过偶数名词找到下一个奇数名次的学生odd.next = even.next并记录该学生odd = odd.next。
  • 偶秀学院校长:同理,负责偶数名次的学生,把当前偶数名次的学生直接指向下一个偶数名次的学生even.next = odd.next并记录该学生even = even.next。
  • 两位校长交替处理,直到偶数校长发现自己没有更多学生可分配(到达名单末尾)。

重组名单:奇数组接在偶数组前面:

  • 两位校长工作完成后,奇数名次学生和偶数名次学生都已经排好。
  • 奇才学府校长将自己的最后一名学生,指向 偶秀学院的第一名学生even_head),完成整合odd.next = even_head。
  • 名单重新排列完毕,校长将重排后的名单交给教育部return head。

复杂度

  • 时间复杂度:O(n)

    • 每个学生被访问一次,所有操作都是线性的。总复杂度是 O(n),其中 n 是学生人数。
  • 空间复杂度:O(1)

    • 只用了两位校长(两个指针)和一个记录 (even_head),没有额外开辟空间,复杂度为 O(1)。

记忆秘诀

  • 分校:奇数排名的归奇才学府,偶数排名的归偶秀学院
  • 整队:奇数队排在前,偶数队接在后,保证顺序不乱

python代码

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param head ListNode类 
# @return ListNode类
#
class Solution:
    def oddEvenList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head  # 链表为空或只有一个节点,直接返回
        
        odd = head  # 奇数位节点
        even = head.next  # 偶数位节点
        even_head = even  # 保存偶数链表的头节点
        
        while even and even.next:
            odd.next = even.next  # 奇数节点连接下一个奇数节点
            odd = odd.next  # odd 指针前进
            even.next = odd.next  # 偶数节点连接下一个偶数节点
            even = even.next  # even 指针前进
        
        odd.next = even_head  # 将奇数节点链表的尾部与偶数节点链表的头部相连
        
        return head  # 返回重排后的链表
        

* 欢迎大家探讨新思路,能够更好的理解和记忆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乱七八糟2333

随缘打赏,一分也是爱!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值