【力扣hot100题】(032)排序链表

挺难的,主要是对排序算法不熟悉。

看了答案,归并排序真的是一个很好的解法。

大致思路是递归,将链表不断拆分为小块,每块进行排序后合并新块。

这种排序对链表来说真的是个很不错的选择,因为链表二分可以用快慢指针,合并之前做过,很好做。

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* dg(ListNode* head,ListNode* tail){
        if(head==nullptr) return head;
        if(head->next==tail){
            head->next=nullptr;
            return head;
        }
        ListNode* slow=head;
        ListNode* fast=head;
        while(fast!=tail){
            slow=slow->next;
            fast=fast->next;
            if(fast!=tail) fast=fast->next;
        }
        ListNode* h=dg(head,slow);
        ListNode* t=dg(slow,tail);
        ListNode* pre=new ListNode(0);
        ListNode* result=pre;
        while(h||t){
            if(t==nullptr||h&&h->val<t->val){
                pre->next=h;
                h=h->next;
            }
            else if(h==nullptr||h->val>=t->val){
                pre->next=t;
                t=t->next;
            }
            pre=pre->next;
        }
        return result->next;
    }
    ListNode* sortList(ListNode* head) {
        return dg(head,nullptr);
    }
};
相关推荐
野犬寒鸦10 分钟前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总12 分钟前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
rainbow688920 分钟前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法
果果燕32 分钟前
今日学习笔记:双向链表、循环链表、栈
笔记·学习·链表
wangjialelele1 小时前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先
xuxie991 小时前
day 21 双向链表以及循环链表
数据结构·链表
驱动探索者1 小时前
linux mailbox 学习
linux·学习·算法
ringking1231 小时前
autoware-1:安装环境cuda/cudnn/tensorRT库函数的判断
人工智能·算法·机器学习
大闲在人2 小时前
8. 供应链与制造过程术语:产能
算法·制造·供应链管理·智能制造·工业工程
一只小小的芙厨2 小时前
寒假集训笔记·以点为对象的树形DP
c++·算法