[Leetcode]148. 排序链表(归并排序)

题目

在?O(n?log?n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

输入: 4->2->1->3
输出: 1->2->3->4
示例 2:

输入: -1->5->3->4->0
输出: -1->0->3->4->5

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

题解

归并排序的递归实现。
在递归过程中:
- 若只有一个节点,直接返回
- 找到中点,分成左右两个链表
- 递归 左边链表
- 递归 右边链表
- 两路归并排序
- 返回排好序的链表

待做

归并排序的非递归实现

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   public ListNode sortList(ListNode head) {
        return head == null ? null : merge(head);
    }

    private ListNode merge(ListNode head) {// 归并排序
        // 如果只剩一个节点,直接返回节点
        if (head == null || head.next == null) {//
            return head;
        }

        // 找到链表中点
        ListNode pSlow = head;
        ListNode pFast = head;
        ListNode pPre = null;
        while (pFast != null && pFast.next != null) {
            pPre = pSlow;
            pFast = pFast.next.next;
            pSlow = pSlow.next;
        }
        pPre.next = null;// 把中点与中点前的节点切断;
        ListNode lList = merge(head);// 返回已排好序的左半边链表
        ListNode rList = merge(pSlow);// 返回已排好序的右半边链表 //
        ListNode sortList = mergeSort(lList, rList);// 对head的链表归并排序 //
        return sortList;
    }

    private ListNode mergeSort(ListNode l, ListNode r) {// 两路归并
        ListNode dummyHead = new ListNode(-1);
        ListNode cur = dummyHead;

        while (l != null && r != null) {
            if (l.val <= r.val) {
                cur.next = l;
                l = l.next;
                cur = cur.next;
            } else {
                cur.next = r;
                r = r.next;
                cur = cur.next;
            }
        }
        if (l != null) {
            cur.next = l;
        }
        if (r != null) {
            cur.next = r;
        }
        return dummyHead.next;
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/12254149.html

时间: 2024-10-09 00:57:43

[Leetcode]148. 排序链表(归并排序)的相关文章

LeetCode 148. 排序链表

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3输出: 1->2->3->4 示例 2: 输入: -1->5->3->4->0输出: -1->0->3->4->5算法:归并排序(且只能归并排序,因为题目做了要求).我们依据归并排序的思想.将原链表分为两部分进行递归排序即可. /** * Definition for singly-linked list.

leetcode 148. 排序链表(c++)

在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3输出: 1->2->3->4示例 2: 输入: -1->5->3->4->0输出: -1->0->3->4->5 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNo

148.排序链表

题目描述: 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->5 思路: 要求 O(n log n) 时间复杂度和常数级空间复杂度,首先想到的就是快速排序和归并排序. 此处使用归并排序, 归并排序大致思想是: 1.将链表划分左右两部分-->

力扣148——排序链表

原题 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->5 原题url:https://leetcode-cn.com/problems/sort-list/ 解决 题目很明确,排序,对于时间复杂度和空间复杂度有要求,针对O(n log n),

Leetcode 148. Sort List 归并排序 in Java

148. Sort List Total Accepted: 81218 Total Submissions: 309907 Difficulty: Medium Sort a linked list in O(n log n) time using constant space complexity. /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; *

Leetcode:Sort List 对单链表归并排序

Sort a linked list in O(n log n) time using constant space complexity. 看到O(n log n)的排序算法,适合单链表的首先想到的就是归并排序 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ cla

单链表的排序 快速排序 归并排序 quicksort mergesort

原理都很简单,关键是某些边界能否正确写对: #include<iostream> #include<stdio.h> using namespace std; class Node { public: int val; Node* next; Node(int val = 0):val(val),next(NULL){ } }; Node* quicksort(Node* head, Node* tail) { Node *res1 = NULL, *res2 = NULL; No

LeetCode 第23题 合并K个排序链表

/* 23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6 */ /** * Definition for singly-linked list. public class ListNode { int val; ListNode next; ListNode(int * x

LeetCode 23. 合并K个排序链表(Merge Two Sorted Lists)

23. 合并K个排序链表 23. Merge k Sorted Lists 题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. LeetCode23. Merge k Sorted Lists困难 示例: 输入: [ ??1->4->5, ??1->3->4, ??2->6] 输出: 1->1->2->3->4->4->5->6 Java 实现 public class ListNode { int va