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,分别指向前面该处理的节点和后面该处理的节点

当前指针超过后指针时,退出循环。

注意事项:

  1. 用head遍历完链表后,head已经不再指向头节点,记得将head归位
  2. 记得将链表的最后一个节点的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. 重排链表的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode——重排链表

LeetCode:143. 重排链表

Leetcode 143.重排链表

Leetcode 143 重排链表

LeetCode Java刷题笔记—143. 重排链表

LeetCode 143. 重排链表