当前位置: 首页 > article >正文

Leetcode148. 排序链表(HOT100)

链接

我写的错误代码:

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        if (!head || !head->next)
            return head;
        ListNode* fast = head;
        ListNode* slow = head;
        while (fast&&fast->next) {
            fast = fast->next->next;
            slow = slow->next;
        }

        ListNode* p = sortList(head);
        ListNode* q = sortList(slow);
        return merge(p, q);
    }
    ListNode* merge(ListNode* p, ListNode* q) {
        ListNode* head = new ListNode(-1);
        while (p && q) {
            if (p->val <= q->val) {
                ListNode* cur = p->next;
                p->next = head->next;
                head->next = p;
                p = p->next;
            } else {
                ListNode* cur = q->next;
                q->next = head->next;
                head->next = q;
                q = q->next;
            }
        }

        ListNode* tail = head;
        while (tail->next) {
            tail = tail->next;
        }
        tail->next = p ? p : q;
        return head->next;
    }
};

 正确代码如下:

/**
 * 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* sortList(ListNode* head) {
        int n = 0;
        for(auto p = head;p;p = p->next)++n;
        for(int i = 1;i<n;i*=2){//刚开始每段只有一个节点,最后一次每段有大约一半节点,合并成最后的答案
            auto dummy = new ListNode(-1),cur = dummy;
            for(int j = 1;j<=n;j+=i*2){
                auto p = head,q = p;
                for(int k = 0;k<i&&q;k++) q = q->next;
                auto o = q;
                for(int k = 0;k<i&&o;k++)o = o->next;
                int l = 0,r = 0;
                while(l<i && r<i && p && q){
                    if(p->val<=q->val)cur = cur->next = p,p = p->next,l++;
                    else cur = cur->next = q,q = q->next,r++;
                }
                while(l<i && p){
                    cur = cur->next = p;
                    p = p->next;
                    l++;
                }
                while(r<i && q){
                    cur = cur->next = q;
                    q = q->next;
                    r++;
                }
                head = o;
            }
            cur->next = nullptr;
            head = dummy->next;
            dummy->next = nullptr;//
            delete dummy;//
        }
        return head;
    }
};

这是自底向上归并排序写法。 

图示:

 

上图cur也要跟随移动。

 

 

 

 

第二轮:
 

 

 

总体图示就这样的。q是依靠p推出来的,刚开始跳1步,然后跳2步........

o是为了记录下一次应该继续排序的位置。

dummy是一个虚拟头结点,cur用来维护它的尾,至于谁往cur->next插入,要看p q指向的节点谁的值小。

每一轮完了后,让head重新回归dummy的next,然后cur->next=nullptr;即将尾置空。

 

 

 

 


http://www.kler.cn/a/406940.html

相关文章:

  • Kafka - 消费者程序仅消费一半分区消息的问题
  • Java编程,配置mongoUri连接mongodb时,需对特殊字符进行转义
  • 文件管理 II(文件的物理结构、存储空间管理)
  • 了解Redis(第一篇)
  • Jmeter数据库压测之达梦数据库的配置方法
  • MacOS通过X11转发远程运行virt-manager进行虚机分配
  • 云轴科技ZStack亮相2024 IDC中国生态峰会,共塑AI时代IT生态新格局
  • 递归算法专题一>Pow(x, n)
  • 计算机毕业设计Python+卷积神经网络CNN交通标志识别 机器学习 深度学习 爬虫 数据可视化 人工智能 模型训练
  • Node.js 和 Socket.IO 实现实时通信
  • 【在Linux世界中追寻伟大的One Piece】多线程(一)
  • ElasticSearch学习笔记四:基础操作(二)
  • Android 基于Camera2 API进行摄像机图像预览
  • Unity DOTS中的Entity
  • 每日计划-1122
  • Linux上安装单机版Kibana6.8.1
  • pytest框架实现一些前后置(固件,夹具)处理,常用三种
  • o1的风又吹到多模态,直接吹翻了GPT-4o-mini
  • MySQL和ADSDB
  • 开源图床的技巧与实践
  • 看Threejs好玩示例,学习创新与技术(ogl)
  • GitLab 备份与恢复
  • 【iOS】bug调试技巧
  • 代码随想录1016-Day16
  • git base 下载$ git clone 失败解决方法
  • python之flask框架的使用