题解 | #重排链表#

首先理清思路,重排链表的结果就是,合并前半部分和倒着的后半部分。

由此,确定两种思路:

O(n): 使用一个列表存储链表元素,前顺序,后逆序,直至相遇

O(1): 首先选取中间位置,翻转后半部分,合并两部分链表,这实际上是三个函数的代码,一定要对每一个步骤都心里有数

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
import java.util.*;

public class Solution {
    public void reorderList(ListNode head) {
        // O(1): 首先选取中间位置,翻转后半部分,合并两部分链表
        // O(n): 使用一个链表存储元素,逆序取
        if (head == null || head.next == null) {
            return;
        }
        /* ListNode n = head;
        ArrayList<ListNode> list = new ArrayList<>();
        while (n != null) {
            list.add(n);
            n = n.next;
        }

        // 交换
        int l = 0, r = list.size() - 1;
        while (l < r) {
            list.get(l).next = list.get(r);
            list.get(r).next = list.get(l + 1);
            l++;
            r--;
        }
        list.get(l).next = null; */
        // 获取中间位置
        ListNode middle = getMiddle(head);
        ListNode n2 = reverse(middle.next);
        ListNode n1 = head, h1 = head;
        while (n1 != null) {
            if (n1.equals(middle)) {
                n1.next = null;
            }
            n1 = n1.next;
        }
        head = rebase(h1, n2);

    }

    private ListNode rebase(ListNode n1, ListNode n2) {
        if (n1 == null || n2 == null) {
            return null;
        }
        ListNode h1 = n1, h2 = n2, next1 = h1.next, next2 = h2.next;
        while (n1 != null && n2 != null) {
            next1 = n1.next;
            next2 = n2.next;
            n1.next = n2;
            if (next1 != null) {
                n2.next = next1;
            }
            n1 = next1;
            n2 = next2;
        }
        return h1;
    }

    private ListNode getMiddle(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        
        ListNode fast = head, slow = head;
        while (fast.next != null && fast.next.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        System.out.println(slow.val);
        return slow;
    }

    private ListNode reverse(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode pre = null, node = head, next = head.next;
        while (node != null) {
            next = node.next;
            node.next = pre;
            pre = node;
            node = next;
        }
        System.out.println(head.val);
        return pre;
    }
}

全部评论

相关推荐

明明就不饿:看不懂你到底会啥,什么岗位
点赞 评论 收藏
分享
02-28 01:18
已编辑
南昌大学 后端工程师
后测速成辅导一两个月...:把开源经历放个人项目上边应该更好,就像大部分人都把实习经历放个人项目上边
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3423次浏览 43人参与
# HR最不可信的一句话是__ #
1038次浏览 32人参与
# 巨人网络春招 #
11500次浏览 224人参与
# 春招至今,你的战绩如何? #
15286次浏览 141人参与
# AI面会问哪些问题? #
911次浏览 22人参与
# 你的实习产出是真实的还是包装的? #
2862次浏览 52人参与
# MiniMax求职进展汇总 #
25003次浏览 321人参与
# 沪漂/北漂你觉得哪个更苦? #
1361次浏览 40人参与
# 你做过最难的笔试是哪家公司 #
1161次浏览 20人参与
# AI时代,哪个岗位还有“活路” #
2736次浏览 50人参与
# XX请雇我工作 #
51149次浏览 171人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7982次浏览 43人参与
# 简历第一个项目做什么 #
32100次浏览 359人参与
# 简历中的项目经历要怎么写? #
310955次浏览 4260人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152854次浏览 889人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187566次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64582次浏览 867人参与
# 如果重来一次你还会读研吗 #
229990次浏览 2011人参与
# 投格力的你,拿到offer了吗? #
178284次浏览 891人参与
# 你怎么看待AI面试 #
180699次浏览 1298人参与
# 正在春招的你,也参与了去年秋招吗? #
364256次浏览 2641人参与
# 腾讯音乐求职进展汇总 #
160831次浏览 1114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务