【归并】单链表的排序

求解代码

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));
}
相关推荐
小雪崩1 小时前
嵌入式学习 day25:哈希表及排序与查找
linux·c语言·数据结构·学习·排序算法
_Narcissus_4 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
_Narcissus_6 小时前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举
冻柠檬飞冰走茶6 小时前
《数据结构实验指导-C++语言版》 在顺序表 list 中查找元素 x
开发语言·数据结构·c++·算法·list
Brilliantwxx6 小时前
【C++】 高阶数据结构图(1)并查集
开发语言·数据结构·c++
Fa_Mian_Tuan6 小时前
最小生成树之Kruskal算法(超详细原理+完整可运行C语言代码)
c语言·开发语言·数据结构·笔记·算法·图论
冻柠檬飞冰走茶7 小时前
《数据结构实验指导-C++语言版》 返回单链表 list 中第 i 个元素值
开发语言·数据结构·c++·算法·list
Escalating_xu8 小时前
【C++ list 深度解析】从双向循环链表、常用接口与迭代器失效到核心模拟实现
c++·链表·list
LuminousCPP8 小时前
栈和队列专题(四):LeetCode 232. 用栈实现队列|双栈分工 + 按需迁移 + 摊还 O(1)
c语言·数据结构·笔记·算法·leetcode
纪念 2298 小时前
二叉树排序讲解(一)
数据结构