🗒️一个链表,单索引是递增的,双索引是递减的,请对它进行升序排序,要求O(1)空间复杂度
2024-11-4
| 2024-11-5
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
创建时间
Nov 4, 2024 03:24 AM
这是一道组合题,拆开的话Leetcode能找到 合并两个有序链表 https://leetcode.cn/problems/merge-two-sorted-lists/ 反转链表 https://leetcode.cn/problems/reverse-linked-list/description/ 奇偶链表(这道题主要是偶数链在了奇数后面,字节这个的话是奇偶分离了) https://leetcode.cn/problems/odd-even-linked-list/description/

21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

朴素写法
可以加快的写法,后面不用再重复挨个赋值。

206. 反转链表

给你单链表的头节点 head,请你反转链表,并返回反转后的链表。

反转单链表有两种写法,这是比较简单的写法。
这个是稍微复杂的写法
Java 版本

328. 奇偶链表

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

解法:解法代码稍微优点冗余,但是可读性还是好理解。我们先初始化两个虚拟节点,分别是用于指向奇偶链表的头节点。然后就开始遍历链表,奇偶拆分。这样就会得到两个链表,最后首尾相接两个链表。
在连接链表的时候,需要注意的是偶链表的结尾。如果原来的整个链表是偶数个节点,那么得到的偶链表的最后节点的 next 是指向为 nullptr 的,这是没问题。如果是原来的整个链表是奇数个节点,那么得到的偶链表的最后节点的 next 是指向为链表的最后的元素,不是指向为 nullptr 的,会导致链表出现循环。
简洁一点的写法,理解上会有点麻烦。
 

📎 参考

  • 面试题
  • 56. 合并区间第 422 场周赛
    Loading...