LeetCode 143.重排链表

题目

给定一个单链表 L的头节点 head ,单链表 L 表示为:

复制代码
L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

复制代码
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

思路:找中点,反转,前后逐一重排

代码

java 复制代码
class Solution {
    public void reorderList(ListNode head) {
        ListNode mid = middleNode(head);
        ListNode head2 = reverseList(mid);
        while (head2.next != null) {
            ListNode nxt = head.next;
            ListNode nxt2 = head2.next;
            head.next = head2;
            head2.next = nxt;
            head = nxt;
            head2 = nxt2;
        }
    }
    private ListNode middleNode(ListNode head) {
        ListNode slow = head, fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
    private ListNode reverseList(ListNode head) {
        ListNode pre = null, cur = head;
        while (cur != null) {
            ListNode nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
        }
        return pre;
    }
}

性能

时间复杂度o(n)

空间复杂度o(1)

相关推荐
TracyCoder12330 分钟前
LeetCode Hot100(13/100)——238. 除了自身以外数组的乘积
算法·leetcode
CoderCodingNo32 分钟前
【GESP】C++五级练习题 luogu-P3353 在你窗外闪耀的星星
开发语言·c++·算法
Anastasiozzzz35 分钟前
LeetCode Hot100 215. 数组中的第K个最大元素
数据结构·算法·leetcode
让我上个超影吧36 分钟前
【力扣76】最小覆盖子串
算法·leetcode·职场和发展
近津薪荼1 小时前
优选算法——双指针5(单调性)
c++·学习·算法
2401_857683541 小时前
C++代码静态检测
开发语言·c++·算法
时艰.1 小时前
JVM 垃圾收集器(G1&ZGC)
java·jvm·算法
2401_838472511 小时前
内存泄漏自动检测系统
开发语言·c++·算法
m0_706653231 小时前
基于C++的爬虫框架
开发语言·c++·算法
diediedei1 小时前
嵌入式数据库C++集成
开发语言·c++·算法