写点什么

leetcode 148. Sort List 排序链表 (中等)

作者:okokabcd
  • 2022 年 9 月 04 日
    山东
  • 本文字数:857 字

    阅读完需:约 3 分钟

leetcode 148. Sort List 排序链表(中等)

一、题目大意

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。


示例 1:


输入:head = [4,2,1,3]输出:[1,2,3,4]


示例 2:


输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]


示例 3:


输入:head = []输出:[]


提示:


  • 链表中节点的数目在范围 [0, 5 * 104] 内

  • -105 <= Node.val <= 105


**进阶:**你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?


来源:力扣(LeetCode)链接:https://leetcode.cn/problems/sort-list著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

用快慢指针将列表分成两部分,将两部分列表递归排序,再将排序后的列表合并

三、解题方法

3.1 Java 实现

class Solution {    public ListNode sortList(ListNode head) {        if (head == null || head.next == null) {            return head;        }        // 使用快慢指针找出中间节点,将链表一分为二        ListNode slow = head;        ListNode fast = head.next;        while (fast != null && fast.next != null) {            fast = fast.next.next;            slow = slow.next;        }        ListNode mid = slow.next;        slow.next = null;        return merge(sortList(head), sortList(mid));    }
ListNode merge(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(); ListNode tail = dummy; while (l1 != null && l2 != null) { if (l1.val > l2.val) { tail.next = l2; l2 = l2.next; } else { tail.next = l1; l1 = l1.next; } tail = tail.next; } if (l1 != null) { tail.next = l1; } if (l2 != null) { tail.next = l2; } return dummy.next; }}
复制代码

四、总结小记

  • 2022/9/3 要与邻里打好交道,远亲不如近邻呀

发布于: 刚刚阅读数: 3
用户头像

okokabcd

关注

还未添加个人签名 2019.11.15 加入

一年当十年用的Java程序员

评论

发布
暂无评论
leetcode 148. Sort List 排序链表(中等)_LeetCode_okokabcd_InfoQ写作社区