跳至主要內容

328. 奇偶链表


328. 奇偶链表

🟠   🔖  链表  🔗 力扣open in new window LeetCodeopen in new window

题目

Given the head of a singly linked list, group all the nodes with odd indices together followed by the nodes with even indices, and return the reordered list.

The first node is considered odd , and the second node is even , and so on.

Note that the relative order inside both the even and odd groups should remain as it was in the input.

You must solve the problem in O(1) extra space complexity and O(n) time complexity.

Example 1:

Input: head = [1,2,3,4,5]

Output: [1,3,5,2,4]

Example 2:

Input: head = [2,1,3,5,6,4,7]

Output: [2,3,6,7,1,5,4]

Constraints:

  • The number of nodes in the linked list is in the range [0, 10^4].
  • -10^6 <= Node.val <= 10^6

题目大意

把所有奇数节点拼接在一起,然后再拼接上所有偶数节点。

请原地(in-place)实现,要求空间复杂度 O(1),时间复杂度 O(n)。

解题思路

通过两个指针分别维护奇数节点和偶数节点的链表:

  1. 判断链表是否为空或只有一个节点,直接返回链表。
  2. 使用两个指针:
    • odd 指向当前奇数索引的最后一个节点。
    • even 指向当前偶数索引的最后一个节点,并用 evenHead 保存偶链表的头节点,方便最后拼接。
  3. 遍历链表时:
    • 奇节点的下一个节点直接连接到偶节点的下一个节点,odd 移动到下一个奇节点。
    • 偶节点的下一个节点直接连接到奇节点的下一个节点,even 移动到下一个偶节点。
  4. 遍历结束后,将奇数链表的末尾连接到 evenHead
  5. 返回头节点。

例如:

  1. 初始链表:1 -> 2 -> 3 -> 4 -> 5
  2. 奇数节点:2 -> 3 -> 5
  3. 偶数节点:2 -> 4
  4. 合并:1 -> 3 -> 5 -> 2 -> 4

复杂度分析

  • 时间复杂度: O(n),遍历链表一次。
  • 空间复杂度: O(1),原地操作,无额外空间分配。

代码

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var oddEvenList = function (head) {
	if (!head || !head.next) return head; // 特殊情况处理

	let odd = head; // 奇数链表的最后一个节点
	let even = head.next; // 偶数链表的第一个节点
	let evenHead = even; // 保存偶数链表的头节点

	while (even && even.next) {
		odd.next = even.next; // 连接下一个奇数节点
		odd = odd.next; // 移动奇数指针
		even.next = odd.next; // 连接下一个偶数节点
		even = even.next; // 移动偶数指针
	}

	odd.next = evenHead; // 将奇数链表的尾部连接到偶数链表的头部
	return head;
};

相关题目

题号标题题解标签难度力扣
725分隔链表链表🟠🀄️open in new window 🔗open in new window