LeetCode 0143. 重排链表
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0143. 重排链表相关的知识,希望对你有一定的参考价值。
【LetMeFly】143.重排链表
力扣题目链接:https://leetcode.cn/problems/reorder-list/
给定一个单链表 L
的头节点 head
,单链表 L
表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4] 输出:[1,4,2,3]
示例 2:
输入:head = [1,2,3,4,5] 输出:[1,5,2,4,3]
提示:
- 链表的长度范围为
[1, 5 * 104]
1 <= node.val <= 1000
方法一:哈希表
遍历链表,将链表节点存入哈希表中,映射关系为<[第几个节点, 节点]>
(其实这里使用数组也可以,虽然复杂度相同,但是数组的实际开销还是要小一些)
然后,用两个指针 l l l和 r r r,分别指向前面该处理的节点和后面该处理的节点
当前指针超过后指针时,退出循环。
注意事项:
- 用head遍历完链表后,head已经不再指向头节点,记得将head归位
- 记得将链表的最后一个节点的next置空
- 时间复杂度 O ( n ) O(n) O(n),其中 n n n是链表节点个数
- 空间复杂度 O ( n ) O(n) O(n)
AC代码
C++
class Solution
public:
void reorderList(ListNode* head)
unordered_map<int, ListNode*> ma;
int cnt = 0;
while (head)
ma[cnt++] = head;
head = head->next;
head = ma[0]; // head归位
int l = 1, r = cnt - 1; // 待指定
bool front = false;
while (l <= r)
if (front)
head->next = ma[l++];
front = false;
else
head->next = ma[r--];
front = true;
head = head->next;
head->next = nullptr; // 最后一个节点的next置空
;
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126031446
以上是关于LeetCode 0143. 重排链表的主要内容,如果未能解决你的问题,请参考以下文章