排序链表的三种写法

题目链接:https://leetcode.cn/problems/sort-list/?envType=study-plan-v2&envId=top-100-liked

第一种,插入排序,会超时

java 复制代码
class Solution {
    public ListNode sortList(ListNode head) {
        //插入排序,用较为简单的方式解决
        ListNode dummyNode = new ListNode(0,null);
        ListNode p = head;
        while(p!=null){
            ListNode temp = p;
            p=p.next;
            //将temp插入到链表当中
            ListNode q = dummyNode;
            int flag = 0;
            while(q.next!=null){
                if(q.next.val>=temp.val){
                    ListNode t = q.next;
                    q.next = temp;
                    temp.next = t;
                    flag= 1;
                    break;
                }
                q = q.next;
            }
            //说明插在最后一个
            if(flag==0){
                q.next = temp;
                temp.next = null;
            }
        }
        return dummyNode.next;
    }
}

第二种,推荐面试直接写,堆排序,借助优先队列,能5分钟秒了

java 复制代码
/**
 * 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) {
        //推荐使用优先队列
        PriorityQueue<ListNode> queue = new PriorityQueue<>(new Comparator<>(){
            public int compare(ListNode a ,ListNode b){
                return a.val-b.val;
            }
        });
        ListNode p = head;
        while(p!=null){
            queue.offer(p);
            p=p.next;
        }
        ListNode dummy = new ListNode(0);
        ListNode q = dummy;
        while(queue.isEmpty()==false){
            ListNode node = queue.poll();
            q.next = node;
            q = q.next;
            q.next = null;
        }
        return dummy.next;
    }
}

第三种,归并排序,主要就是分为归并和合并两部分。合并很简单。拆分时候,通过快慢指针拆出来两个链表头。

java 复制代码
class Solution {
    public ListNode sortList(ListNode head) {
        if(head==null||head.next==null)return head;
        ListNode slow = head;
        //这里一定一定要slow和fast分开
        //不然 4 2 会出现,head一直是4,newHead一直是空的情况
        ListNode fast = head.next;
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode newHead = slow.next;
        slow.next = null;
        return merge(sortList(head),sortList(newHead));
    }
    public ListNode merge(ListNode l1,ListNode l2){
        ListNode p = l1;
        ListNode q = l2;
        ListNode dummy = new ListNode(0);
        ListNode t = dummy;
        while(p!=null&&q!=null){
            if(p.val<q.val){
                t.next = p;
                p=p.next;
            }else{
                t.next = q;
                q=q.next;
            }
            t=t.next;
        }
        t.next = p==null?q:p;
        return dummy.next;
    }
}
相关推荐
和编程干到底20 小时前
数据结构 栈和队列、树
数据结构·算法
爱编程的化学家21 小时前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录
shan&cen1 天前
Day04 前缀和&差分 1109. 航班预订统计 、304. 二维区域和检索 - 矩阵不可变
java·数据结构·算法
屁股割了还要学1 天前
【数据结构入门】排序算法(4)归并排序
c语言·数据结构·学习·算法·排序算法
Chance_to_win1 天前
数据结构之顺序表
数据结构
lifallen1 天前
字节跳动Redis变种Abase:无主多写架构如何解决高可用难题
数据结构·redis·分布式·算法·缓存
MMjeaty1 天前
map/multimap容器
数据结构·c++
zstar-_1 天前
【不背八股】12.十大排序算法
数据结构·算法·排序算法
吃着火锅x唱着歌1 天前
LeetCode 2110.股票平滑下跌阶段的数目
数据结构·算法·leetcode
疋瓞1 天前
C++_STL和数据结构《1》_STL、STL_迭代器、c++中的模版、STL_vecto、列表初始化、三个算法、链表
数据结构·c++·算法