排序链表 优先队列+归并排序

题目:

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

思路:

  思1 :优先队列将链表数据入队,新建一个ListNode 将数据连接起来,注意保存头指针进行返回

  思2 :归并排序 (递归拆分,将拆分后的归并起来---666) (注意掌握


(一)代码   优先队列       时间复杂度:O(n logn) 空间复杂度:O(n)

  

 


 

(二)归并方法  递归拆分为两段,将两段按顺序和起来(归并

import java.util.PriorityQueue;

//归并
//先拆分 在合并
class Solution {
    public ListNode sortList(ListNode head) {
        //空指针判断
        if(head == null){
            return head;
        }
        return splitListNode(head);
    }

    //拆分函数,运用快慢指针,当快指针的next为空时,慢指针就走到了中间的位置
    public ListNode splitListNode(ListNode head){
        //递归出口
        if(head == null || head.next == null) return head;
        ListNode slow = head;  //慢指针
        ListNode fast = head;  //快指针
        while(fast != null && fast.next != null && fast.next.next != null){
              fast = fast.next.next; //移动指针
              slow = slow.next;      //移动指针
        }
        //递归
        ListNode right = splitListNode(slow.next);
        slow.next = null;  //注意此处,需要回归理解
        ListNode left = splitListNode(head);
        return merge(left,right);
    }

    //合并链表函数
    public ListNode merge(ListNode left,ListNode right){

        ListNode listNode = new ListNode(0);
        ListNode resNode = listNode; //定义返回的头结点
        while(left != null && right != null){
            if(left.val <= right.val){
                listNode.next = left;
                left = left.next;
            }else{
                listNode.next = right;
                right = right.next;
            }
            listNode = listNode.next;
        }
        if(left != null) listNode.next = left;
        if(right != null) listNode.next = right;
        return resNode.next;
    }
}

 

  


 

 

 

      入市赌一把,单车 或 摩托 ?

      

    

 

posted @ 2021-06-18 14:42  朝才  阅读(194)  评论(0编辑  收藏  举报