leetcode 148. Sort List ,我想用stl里面list特有的sort解法来做,结果有问题

发布于 2022-09-03 14:02:55 字数 2747 浏览 13 评论 0

这是stl中容器list成员函数sort的实现


void sortList(list<int> &a) {
    if(a.size() <= 1){
        return;
    }
    
    list<int> carry;       // 辅助链表,用于从a中提取元素以及临时保存两个链表的合并结果
    list<int> counter[64]; // 保存着当前每一个归并层次的结果, i号链表保存的元素个数为2的i次方或者0
    int fill = 0;          // 表示当前最大归并排序的层次,while循环之后fill变成log2(a.size())
    
    while (!a.empty()) {
        carry.splice(carry.begin(), a, a.begin()); // 将链表a中的第一个元素移动至carry开头
        int i = 0;
        // 从小往大不断合并非空归并层次直至遇到空层或者到达当前最大归并层次
        while (i < fill && !counter[i].empty()) {  
            counter[i].merge(carry);    // 链表合并,结果链表是有序的,必须保证合并前两个链表是有序的
            carry.swap(counter[i++]);   // 链表元素互换
        }
        carry.swap(counter[i]);
        if (i == fill) {       // i到达当前最大归并层次,说明得增加一层
            ++fill;
        }
    }
    
    for (int i = 1; i < fill; ++i) {  // 将所有归并层次的结果合并得到最终结果counter[fill - 1]
        counter[i].merge(counter[i - 1]);
    }
    a.swap(counter[fill - 1]);
}

我想仿照这种做法,即链表的归并迭代方式,来求解leetcode148题https://leetcode.com/problems...
但是无法实现,下面是我的代码
另外我已经做了链表的归并递归方法,我觉得迭代应该更优,想尝试一下

class Solution {
public:
    ListNode* sortList(ListNode* head) {
        if(!head||!head->next)return head;
        ListNode*carry=NULL;
        ListNode*count[64];
        int fill=0;
        while(head){
            carry=new ListNode(head->val);
            head=head->next;
            int i=0;
            while(i<fill&&!count[i]){
                merge(count[i],carry);
                swap(carry,count[i]);
                i++;
            }
            swap(carry,count[i]);
            if(i==fill){
                fill++;
            }
        }
        for(int i=1;i<fill;i++){
            merge(count[i],count[i-1]);
        }
        return count[fill-1];
    }
private:
//模仿链表容器的merge成员函数
//将链表s2合并入s1中,默认s1,s2都是sorted,并且最后s2为NULL
    void merge(ListNode*s1,ListNode*s2){
        if(!s1){
            auto temp=s2;
            s2=NULL;
            s1=s2;
            return;
        }
        ListNode* dump=new ListNode(-1);
        ListNode* newHead;
        newHead=dump;
        if(!s2)return;
        while(s1&&s2){
            if(s1->val<s2->val){
                newHead->next=s1;
                s1=s1->next;
            }
            else{
                newHead->next=s2;
                s2=s2->next;
            }
            newHead=newHead->next;
        }
        if(s1)newHead->next=s1;
        else if(s2)newHead->next=s2;
        s2=NULL;
        s1=dump->next;
        delete dump;
        return ;
    }
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

遗失的美好 2022-09-10 14:02:55

merge里修改s2为NULL并没有效果。
然后在sortList合并时会出现混乱

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文