Sort List

作者: 瞬铭 | 来源:发表于2020-07-08 14:43 被阅读0次

https://leetcode.com/problems/sort-list/
对于整数构成的链表,将其排序 O(NLogN)时间复杂度,O(1)空间复杂度

  • 思路
    归并思路,因为链表特有属性,无法进行堆排序和快排
public ListNode sortList(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode slow = head;
        ListNode fast = head;
        while (fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode fastHead = head;
        ListNode slowHead = slow.next;

        slow.next = null;

        fastHead = sortList(fastHead);
        slowHead = sortList(slowHead);
        return mergeList(fastHead, slowHead);
    }

    //merge 两个有序链表
    public ListNode mergeList(ListNode list1, ListNode list2) {

        ListNode res = new ListNode(-1);
        ListNode head = res;

        while (list1 != null && list2 != null) {

            if (list1.val > list2.val) {
                head.next = new ListNode(list2.val);
                list2 = list2.next;
            } else {
                head.next = new ListNode(list1.val);
                list1 = list1.next;
            }
            head = head.next;
        }

        if (list1 != null) {
            head.next = list1;
        }

        if (list2 != null) {
            head.next = list2;
        }
        return res.next;
    }
  • 插入排序思路
    时间复杂度O(N2),空间复杂度O(1)
    单独开一个res链表,维持这个res是有序的~ 并且保证从head遍历的val能插入到此链表中
 public ListNode insertionSortList(ListNode head) {

        //结果链表
        ListNode res = new ListNode(-1);

        ListNode curr = res;

        while (head != null) {

            ListNode nn = head.next;

            //每次循环进来都把curr置为链表头,最开始的那个
            curr = res;

            //因为目前res的这个链表是从小到大排列的
            //这个循环是找到head目前对应的val应该插入到res的哪个节点
            while (curr.next != null && curr.next.val <= head.val) {
                curr = curr.next;
            }

            //找到head应该插入res的哪个节点
            //在res中进行插入
            head.next = curr.next;
            curr.next = head;
            head = nn;
        }
        return res.next;
    }

相关文章

网友评论

      本文标题:Sort List

      本文链接:https://www.haomeiwen.com/subject/rikccktx.html