萤火小屋

优律的知识库

  • 首页
  • 归档
  • 分类
  • 标签
  • 留言
  • 关于

  • 搜索
消息队列 RabbitMQ Redis 双指针 力扣 动态代理 Git YAML SpringBoot SpringMVC 回溯算法 分治算法 归并排序 快排 手撕 事务 MySQL索引 MySQL 小技巧 Spring Framework Spring 动态规划 Linux Android 贪心算法 操作系统 进程调度模拟 IPv6 数据库 计算机组成原理 计算机基础 栈 Java 静态路由 路由器 交换机 数字通信 网络工程 计算机网络 Web http 大学学习技巧 程序设计 算法

力扣第148题-排序链表

发表于 2023-07-03 | 分类于 力扣刷题 | 0 | 阅读次数 18

题目
链接

题解
从顶向下归并排序

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        return sort(head, null);
    }

    /**
     * 快慢指针搭配找到中点
     * 分治中点两边的链表
     */
    private ListNode sort(ListNode head, ListNode tail) {
        if (head == null) {
            return head;
        }
        // 当头的下一个就是尾,将节点孤立返回
        if (head.next == tail) {
            head.next = null;
            return head;
        }
        // 双指针快慢遍历找到中点
        ListNode fast = head, slow = head;
        while (fast != tail) {
            fast = fast.next;
            slow = slow.next;
            if (fast != tail) {
                fast = fast.next;
            }
        }
        ListNode mid = slow;
        // 分治左右
        ListNode l1 = sort(head, mid);
        ListNode l2 = sort(mid, tail);
        // 将分治结果合并成一个链表
        ListNode res = merge(l1, l2);
        return res;
    }

    /**
     * 合并两个联表
     */
    private ListNode merge(ListNode l1, ListNode l2) {
        ListNode mergeList = new ListNode(0);
        ListNode p = mergeList;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                p.next = l1;
                l1 = l1.next;
            } else {
                p.next = l2;
                l2 = l2.next;
            }
            p = p.next;
        }
        if (l1 != null) {
            p.next = l1;
        } else {
            p.next = l2;
        }
        return mergeList.next;
    }

}
# 算法 # 程序设计 # 分治算法 # 力扣 # 双指针
力扣第268题-丢失的数字
力扣第141题-环形链表
  • 文章目录
  • 站点概览
优律

优律

优律的知识库

125 日志
20 分类
44 标签
E-mail Twitter Instagram
Links
  • CZLisyx - 浮生志
  • Vedfolnir
0%
© 2019 — 2023 萤火小屋——优律的博客网站
网站已勉强运行 
Halo博客系统技术支持