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

解题思路:由时间复杂度要求O(nlogn),容易想到快速排序、堆排序、归并排序几种方法,其中适用于链表的是归并排序方法。归并排序分为自顶向下和自底向上两种实现方法,比起自顶向下方法,自底向上的方法省去了递归函数栈使用的空间,使空间复杂度降到了O(1)。
这里给出自自顶向下的归并排序实现。

/**
 * 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) {
        if(head == null || head.next == null)    return head;

        //1.快慢指针遍历链表,找到链表中间结点
        ListNode slow = head, fast = head.next;
        while(fast!=null && fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
        }
        
        //2.slow指向的为head1的尾结点,fast指向的为head2的尾结点, head2 = slow.next
        ListNode head2 = slow.next;
        slow.next = null;   //使左右链表断开
        if(head.next!=null)     head = sortList(head);
        if(head2.next!=null)    head2 = sortList(head2);

        //3.对已排序的左右链表归并
        return merge(head, head2);
    }

    private ListNode merge(ListNode l1, ListNode l2){
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        } else if (l1.val < l2.val) {
            l1.next = merge(l1.next, l2);
            return l1;
        } else {
            l2.next = merge(l1, l2.next);
            return l2;
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 核心思想:将一个数组进行排序,可以先(递归)将他分成两半分别排序,然后把结果合并起来.若将两个有序表合并成一个有序...
    浩林Leon阅读 6,765评论 0 1
  • 题目描述: 在O(nlogn)时间复杂度和常数级空间复杂度下,对链表进行排序。 示例: 输入: -1->5->3-...
    淌水希恩阅读 3,709评论 0 0
  • 一、定义 归并排序分为两种: “自顶向下”的归并排序。该类归并排序是算法设计中“分治”思想的典型应用。其实就是将数...
    null12阅读 3,798评论 0 1
  • 开篇 上篇聊到的堆排序仅用线性对数级别的时间复杂度 O(n log n) 和常数级别的额外辅助空间即可将一个数组排...
    xiaofei_dev阅读 2,256评论 0 0
  • 5.归并排序 5.1归并排序的思想和复杂度 归并排序思想 归并排序主要是分治法的思想,有自顶向下和自底向上的归并排...
    吴金君阅读 1,589评论 0 0

友情链接更多精彩内容