首页 > 其他分享 >对链表进行排序

对链表进行排序

时间:2024-08-14 09:54:40浏览次数:12  
标签:head 排序 ListNode fast next 链表 null 进行

1

public class SortLinkedList {

    // 方法:对链表进行排序
    public static ListNode sortList(ListNode head) {
        // 如果链表为空或只有一个节点,直接返回
        if (head == null || head.next == null) {
            return head;
        }

        // 使用快慢指针找到链表的中间节点
        ListNode mid = getMiddle(head);
        ListNode left = head;
        ListNode right = mid.next;
        mid.next = null;  // 断开链表

        // 递归地对左右两个部分进行排序
        left = sortList(left);
        right = sortList(right);

        // 合并排序后的两部分
        return merge(left, right);
    }

    // 辅助方法:找到链表的中间节点
    private static ListNode getMiddle(ListNode head) {
        if (head == null) {
            return head;
        }
        ListNode slow = head;
        ListNode fast = head.next;

        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

    // 辅助方法:合并两个有序链表
    private static ListNode merge(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode current = dummy;

        while (l1 != null && l2 != null) {
            if (l1.val <= l2.val) {
                current.next = l1;
                l1 = l1.next;
            } else {
                current.next = l2;
                l2 = l2.next;
            }
            current = current.next;
        }

        if (l1 != null) {
            current.next = l1;
        } else {
            current.next = l2;
        }

        return dummy.next;
    }

 

 

标签:head,排序,ListNode,fast,next,链表,null,进行
From: https://www.cnblogs.com/Jomini/p/18358274

相关文章

  • 合并两个有序链表
    1、publicclassMergeTwoSortedLists{//方法:合并两个有序链表publicstaticListNodemergeTwoLists(ListNodel1,ListNodel2){//创建一个虚拟节点作为合并后链表的头节点ListNodedummy=newListNode(0);ListNodecurrent=du......
  • 数据结构之链表超详解(1)
     一人我饮酒醉醉把佳人成双对两眼是独相随只求他日能双归娇女我轻扶琴燕嬉我紫竹林痴情红颜心甘情愿千里把你寻说红颜我痴情笑曲动我琴声妙轻狂高傲懵懂无知只怪太年少弃江山我忘天下斩断情丝无牵挂千古留名传佳话我两年征战已白发一生征战何人陪谁是谁非谁相随戎马一......
  • 当拥有上百个合作伙伴时,如何快速便捷地进行合作伙伴传文件?
    很多公司都有外部合作伙伴,角色包括但不限于供应商、经销商、广告商、客户等。一般的企业合作伙伴不多,在进行日常业务往来和文件传输时,基于日常的通讯工具即可满足。但是对于合作伙伴较多的企业,如几十上百个,像大型制造业,工业,电子商务等,不仅合作伙伴数量庞大,文件往来更是频繁,此时,和......
  • Java数组06:常见排序算法
    1.冒泡排序冒泡排序(BubbleSort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完......
  • 内核链表常用宏——container_of()
    定义#definelist_entry(ptr,type,member)\ container_of(ptr,type,member)#defineoffsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)#definecontainer_of(ptr,type,member)({ \ consttypeof(((type*)0)->member)*__mptr=(ptr); ......
  • SQL进阶技巧:利用Stack()函数进行列转行及动态列转行方法
    目录0需求描述1数据分析 2 stack()函数应用stack(intn,v_1,v_2,...,v_k)n设为3,将后面6个元素按顺序分为3行2列n设为2,将后面6个元素按顺序分为2行3列n设为3,将后面7个元素按顺序分为3行3列n设为6,将后面6个元素转为为6行1列 3小结0需求描述在hive数仓中......
  • [YM]模板-单链表(超详细简洁模板)
    概念:链表是一种用于存储数据的数据结构,通过如链条一般的指针来连接元素。它的特点是插入与删除数据十分方便,但寻找与读取数据的表现欠佳,复杂度几乎是O(n)但其还是有很大的重要性是数据结构的开端模板:题目概述:相信大家对于单链表的操作已经游刃有余了,我们知道,对于一个单......
  • 排序后扣减每行的数量
    importpandasaspdfromtypingimportUnion,Listfromcopyimportdeepcopy  defdeduct_by_sort(basedf:pd.DataFrame,sortby:List[str],ascending:List[bool],deductdf:pd.DataFrame,key:Union[str,List[str]],deductfield:s......
  • VisionPro二次开发学习笔记13-使用CogToolBlock进行图像交互
    该程序演示了如何使用CogToolBlock进行图像交互.从vpp文件中加载一个ToolBlock。用户可以通过应用程序窗体上的数字增减控件修改ToolBlock输入端子的值。用户还可以从coins.idb或采集FIFO中选择图像。“运行一次”按钮执行以下操作:获取下一个图像或读取下一个图像......
  • 27. Hibernate 自动进行数据封装
    1.前言Hibernate可以构建各种复杂的SQL语句,但其本质都是反射机制结合映射关系完成的。框架也仅是一款程序产品,人为编写的产物。要相信,只要你愿意,你完全可以实现自己的JDBC框架。本节课和大家继续聊聊Hibernate是如何自动封装数据的。2.理想状态程序中的数据通过......