从零学算法328

328.给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
示例 1:
输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]
示例 2:
输入: head = [2,1,3,5,6,4,7]
输出: [2,3,6,7,1,5,4]

  • 我的原始人解法:那就定义两个链表一个存奇数节点一个存偶数节点,最后拼接起来即可。用两个节点不断遍历,初始化 a 为 head, b 为 head.next,然后不断让 a = b.next,b = a.next,a 结点就一直存放奇数节点,b 节点一直存放偶数节点
  •   public ListNode oddEvenList(ListNode head) {
          if(head==null)return head;
          ListNode a = head, b = head.next;
          ListNode odd = new ListNode(0),even = new ListNode(0);
          ListNode curOdd = odd, curEven = even;
          while(a!=null || b!=null){
          	// 构建奇数链表
              if(a!=null){
                  curOdd.next = new ListNode(a.val);
                  curOdd = curOdd.next;
              }
              // 构建偶数链表
              if(b!=null){
                  curEven.next = new ListNode(b.val);
                  curEven = curEven.next;
              }
              // a 移动到下一个奇数节点
              a=b!=null?b.next:null;
              // b 移动到下一个偶数节点
              b=a!=null?a.next:null;
          }
          // 连接奇偶链表
          curOdd.next = even.next;
          return odd.next;
      }
    
  • 他人解法:思路类似,但是没必要再创建两个节点用来遍历,直接把原链表 head 以及 head.next 作为奇偶链表的头结点,然后构建的时候从这两个头开始遍历构建即可,
  •   public ListNode oddEvenList(ListNode head) {
          if(head == null || head.next == null)return head;
          ListNode odd = head,even = head.next;
          ListNode curOdd = odd, curEven = even;
          // curEven == null 说明偶链表没法构建了
          // curEven.next == null 其实就是 curOdd.next.next == null
          // 说明奇链表没法构建了
          while(curEven != null && curEven.next != null){
         	  // 构建奇链表
              curOdd.next = curOdd.next.next;
              // 构建偶链表
              curEven.next = curEven.next.next;
              curOdd = curOdd.next;
              curEven = curEven.next;
          }
          curOdd.next = even;
          return odd;
      }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值