🚩传送门:牛客题目

题目

给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。

注意是节点的编号而非节点的数值


数据范围:节点数量满足 [NC]133. 链表的奇偶重排 - 图1,节点中的值都满足 [NC]133. 链表的奇偶重排 - 图2
要求:空间复杂度 [NC]133. 链表的奇偶重排 - 图3,时间复杂度 [NC]133. 链表的奇偶重排 - 图4

示例1

输入:{1,2,3,4,5,6} 返回值:{1,3,5,2,4,6} 说明: 重排前:1->3->5->2->4->6->NULL 重排后:1->2->3->4->5->6->NULL

解题思路:模拟

  • head 指向原链表的表头
  • odd 指向奇数链表的头结点
  • oddTail 指向奇数链表的尾结点
  • even 指向偶数链表的头结点
  • evenTail 指向偶数链表的尾结点
  1. 利用 head 依次遍历原来的链表结点
    • 若原链表不空,将 head 结点插入 odd 链表中,利用 oddTail [NC]133. 链表的奇偶重排 - 图5 操作时间内完成
    • 若原链表不空,将 head 结点插入 even 链表中,利用 evenTail [NC]133. 链表的奇偶重排 - 图6 操作时间内完成
  2. odd 链表和 even 链表合并,利用 oddTail even [NC]133. 链表的奇偶重排 - 图7 操作时间内完成

复杂度分析

时间复杂度:[NC]133. 链表的奇偶重排 - 图8,其中 [NC]133. 链表的奇偶重排 - 图9 为合并后数组的长度。

空间复杂度:[NC]133. 链表的奇偶重排 - 图10,使用常数的空间


我的代码

  1. public ListNode oddEvenList (ListNode head) {
  2. // write code here
  3. if(head==null) return head;
  4. // 奇数头结点,尾指针
  5. ListNode odd=new ListNode(-1);
  6. ListNode oddTail=odd;
  7. //偶数头结点,尾指针
  8. ListNode even=new ListNode(-1);
  9. ListNode evenTail=even;
  10. while(head!=null){
  11. // 先穿奇
  12. if(head!=null){
  13. oddTail.next=head;
  14. oddTail=oddTail.next;
  15. head=head.next;
  16. }
  17. // 后穿偶
  18. if(head!=null){
  19. evenTail.next=head;
  20. evenTail=evenTail.next;
  21. head=head.next;
  22. }
  23. }
  24. // 先奇后偶拼接
  25. oddTail.next=even.next;
  26. evenTail.next=null;
  27. return odd.next;
  28. }