持续创作,加速成长!这是我参与「掘金日新计划 · 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