【归并】单链表的排序

求解代码

java 复制代码
ListNode merge(ListNode pHead1, ListNode pHead2) {
    // 任一链表为空,直接返回另一链表
    if(pHead1==null){
        return pHead2;
    }
    if(pHead2==null){
        return pHead1;
    }

    // 虚拟节点:简化合并后链表头节点的处理
    ListNode dummy = new ListNode(0);
    ListNode head = dummy; // 结果链表的当前指针,用于挂载节点

    while(pHead1!=null&&pHead2!=null){
        if(pHead1.val<=pHead2.val){
            head.next = pHead1;
            pHead1=pHead1.next; 
        }else{
            head.next = pHead2;
            pHead2 = pHead2.next; 
        }
        head=head.next; // 结果指针后移
    }

    // 拼接剩余节点
    if(pHead1!=null){
        head.next = pHead1;
    }else{        
        head.next = pHead2;
    }

    // 返回合并后的链表
    return dummy.next;
}

public ListNode sortInList (ListNode head) {
    // 空链表/单节点链表,直接返回
    if(head ==null||head.next==null){
        return head;
    }

    ListNode left = head;        // 慢指针前驱(用于断开链表)
    ListNode mid = head.next;    // 慢指针(最终指向中点)
    ListNode right = head.next.next; // 快指针(步长2)

    // 持续移动指针,直到快指针到末尾
    while(right!=null&&right.next!=null){
        left = left.next;        // 慢指针前驱后移
        mid = mid.next;          // 慢指针后移(步长1)
        right = right.next.next; // 快指针后移(步长2)
    }
    left.next = null; // 断开链表,拆分为「head→left」和「mid→末尾」两段

    // 递归排序两段链表,再合并结果
    return merge(sortInList(head), sortInList(mid));
}
相关推荐
Logic1011 小时前
C语言/数据结构字符串题解:按字符类型重排(数字→字母→符号)——三趟扫描稳定分区
c语言·数据结构·字符串·时间复杂度·计数排序·算法题·ascii
Logic1017 小时前
C语言/数据结构位运算题解:异或XOR找出学习计划中的“独特学习时间“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
小蒋学算法8 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
思麟呀10 小时前
位运算:从一个整数到一个集合
c语言·数据结构·c++·算法
All for pursuit.12 小时前
【分治-3】347.前K个高频元素
数据结构·c++·算法·leetcode
All for pursuit.13 小时前
【二分查找-2】34.在排序数组中查找元素的第一个和最后一个位置
数据结构·c++·算法·leetcode
bro_Java66614 小时前
链表进阶2:双向链表的构建
java·数据结构·链表
梦帮科技15 小时前
量子张量网络破局大模型:从矩阵乘积态 (MPS) 到张量列 (TT-SVD) 低秩收缩全推导
网络·数据结构·数据库·线性代数·矩阵·架构·模拟退火算法
LOVE️YOU16 小时前
Python 数据结构的本质:位置、对象引用、Hash 与可变性
数据结构·python·哈希算法
不会就选b16 小时前
算法日常・每日刷题--<动态规划>1
java·数据结构·算法