leetcode-链表-328-奇偶链表

158 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

今天讲解的是链表系列的1道题:

1.奇偶链表

328. 奇偶链表

leetcode地址:leetcode.cn/problems/od…

难度

中等

描述

给定单链表的头节点 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]

提示:

  • n ==  链表中的节点数
  • 0 <= n <= 104
  • -106 <= Node.val <= 106

解法

1.判断head为null,则直接返回null

2.定义odd为奇数节点,就是 odd = head

3.定义even为偶数节点, even = head.next

4.定义cur 存储even,后面为了将奇数链表链接偶数链表

5.开始遍历链表

6.将奇数节点指向偶数节点的下一个节点,也就是下一个奇数节点,然后将奇数节点向前移动

7.将偶数节点指向奇数节点的下一个节点,也就是下一个偶数节点,然后将偶数节点想前移动

8.最后将奇数节点链接偶数节点,也就是odd.next=cur,cur是开始时保存的偶数节点

9.最后返回head

代码

/*
 * @lc app=leetcode.cn id=328 lang=javascript
 *
 * [328] 奇偶链表
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
 var oddEvenList = function (head) {
    if (head == null) {
      return head;
    }
    let odd = head;         // 扫描奇数结点
    let even = head.next;   // 扫描偶数结点
    let evenHead = even;    // 保存偶链的头结点
  
    while (even != null && even.next != null) { 
      odd.next = even.next; // even.next是下一个奇数结点
      odd = odd.next;       // odd 推进到下一个奇数结点
      even.next = odd.next; // 下一个奇数结点的next是下一个偶数结点
      even = even.next;     // even 推进到下一个偶数结点
    }
    odd.next = evenHead;    // 奇链连上偶链
    return head;
  };
  
// @lc code=end