【CT】LeetCode手撕—148. 排序链表

题目


1- 思路

  • 排序链表,将每个元素看做一个单独的链表 ——> 归并排序 ——> 每次将单独的链表合并

2- 实现

⭐148. 排序链表——题解思路

在这里插入图片描述

class Solution {
    public ListNode sortList(ListNode head) {

        // 1. 先求链表长度
        int len = 0;
        ListNode forH = head;
        while(forH!=null){
            len++;
            forH = forH.next;
        }

        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;

        // 2. 利用 for 拆分
        for(int subLen = 1 ; subLen < len;subLen*=2){
            ListNode prev = dummyHead, cur = dummyHead.next;
            while(cur!=null){
                
                // 子链1
                ListNode head1 = cur;
                for(int i = 1 ; i < subLen && cur.next !=null ; i++){
                    cur = cur.next;
                }

                // 子链2
                ListNode head2 = cur.next;
                cur.next = null;
                cur = head2;
                for(int i = 1 ; i < subLen && cur!=null && cur.next !=null ;i++){
                    cur = cur.next;
                }

                ListNode next = null;
                if(cur!=null){
                    next = cur.next;
                    cur.next = null;
                }
                ListNode merged = mergeList(head1,head2);
                prev.next = merged;
                while(prev.next!=null){
                    prev = prev.next;
                }
                cur = next;
            }
        }
        return dummyHead.next;
    }

    public ListNode mergeList(ListNode head1,ListNode head2){
        ListNode dummyHead = new ListNode(0);
        ListNode cur = dummyHead;
        ListNode forA = head1;
        ListNode forB = head2;
        while(forA!=null && forB !=null){
            if(forA.val < forB.val){
                cur.next = forA;
                forA = forA.next;
            }else{
                cur.next = forB;
                forB = forB.next;
            }
            cur = cur.next;
        }

        if(forA!=null){
            cur.next = forA;
        }else{
            cur.next = forB;
        }
        return dummyHead.next;
    }
}

3- ACM 实现

public class sortLink {

    static class ListNode{
        int val;
        ListNode next;
        ListNode(){}
        ListNode(int x){
            val = x;
        }
    }

    // 合并链表
    public static ListNode sortList(ListNode head){
        // 1. 求长度
        int len = 0;
        ListNode l = head;
        while (l!=null){
            len++;
            l = l.next;
        }

        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;

        // 自底向上

        for(int subLen = 1 ; subLen < len;subLen*=2){
            ListNode prev = dummyHead,cur = dummyHead.next;
            while(cur!=null){
                ListNode head1 = cur;
                for(int i = 1; i < subLen && cur.next!=null; i++){
                    cur = cur.next;
                }

                ListNode head2 = cur.next;
                cur.next = null;
                cur = head2;
                for(int i = 1; i < subLen && cur!=null && cur.next!=null ; i++){
                    cur = cur.next;
                }

                // 记录next
                ListNode next = null;
                if(cur!=null){
                    next = cur.next;
                    cur.next = null;
                }

                ListNode merged = merged(head1,head2);
                prev.next = merged;
                while(prev.next!=null){
                    prev = prev.next;
                }
                cur = next;
            }

        }
        return dummyHead.next;
    }


    public static ListNode merged(ListNode head1, ListNode head2){
        ListNode dummyHead = new ListNode(-1);
        ListNode cur = dummyHead;
        while(head1!=null && head2 !=null){
            if(head1.val<head2.val){
                cur.next = head1;
                head1 = head1.next;
            }else{
                cur.next = head2;
                head2 = head2.next;
            }
            cur = cur.next;
        }
        if(head1!=null){
            cur.next = head1;
        }else{
            cur.next = head2;
        }
        return dummyHead.next;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入链长度");
        int n = sc.nextInt();

        System.out.println("输入链表元素");
        ListNode head=null,tail=null;
        for(int i = 0 ; i < n;i++){
            ListNode newNode = new ListNode(sc.nextInt());
            if(head==null){
                head = newNode;
                tail = newNode;
            }else{
                tail.next = newNode;
                tail = tail.next;
            }
        }

        ListNode res = sortList(head);
        System.out.println("排序后的链表是");
        while(res!=null){
            System.out.print(res.val +" ");
            res = res.next;
        }
    }
}

相关推荐

  1. leetcode148. 排序

    2024-07-10 16:34:02       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 16:34:02       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 16:34:02       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 16:34:02       4 阅读
  4. Python语言-面向对象

    2024-07-10 16:34:02       5 阅读

热门阅读

  1. C组暑假第一次训练题解

    2024-07-10 16:34:02       8 阅读
  2. 构建基于Spring Boot的数据分析平台

    2024-07-10 16:34:02       11 阅读
  3. 每天一个数据分析题(四百零十)- 主成分

    2024-07-10 16:34:02       8 阅读
  4. 卷积神经网络:目标检测的黄金钥匙

    2024-07-10 16:34:02       12 阅读
  5. Pandas 基础 —— 探索数据分析的第一步

    2024-07-10 16:34:02       11 阅读
  6. MyBatisPlus

    2024-07-10 16:34:02       7 阅读
  7. Android 通用视频组件开发

    2024-07-10 16:34:02       12 阅读
  8. 目标检测算法详细介绍!

    2024-07-10 16:34:02       8 阅读
  9. 中医四大经典之 No.1

    2024-07-10 16:34:02       10 阅读
  10. 支持向量机(Support Vector Machine,SVM)

    2024-07-10 16:34:02       8 阅读
  11. vue2 、 vue3首屏优化,减少白屏时间

    2024-07-10 16:34:02       9 阅读
  12. 对于配置LLM,集显和独显的具体区别和影响

    2024-07-10 16:34:02       10 阅读
  13. Perl 语言入门学习

    2024-07-10 16:34:02       8 阅读
  14. 单例模式之静态内部类与枚举类

    2024-07-10 16:34:02       9 阅读
  15. 爬虫技术抓取网站数据

    2024-07-10 16:34:02       11 阅读