关于#c++#的问题:代码在评论区

力扣148,用归并排序!
不知道为什么错了,详情如图,代码在评论区

img

img

img

img

img

img

修改一个地方,h1和h2需要更新一下,如下:

img

h1 = merge_sort(h1, l);
h2 = merge_sort(h2, r);


/**
 * 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:
    int getLength(ListNode*head){
        int cnt=0;
        while(head){
            cnt+=1;
            head=head->next;
        }
        return cnt;
    }
    ListNode* merge_sort(ListNode*head,int n){
        if(n==1||n==0) return head;
        int l=n/2,r=n-l;
        ListNode*h1,*h2,*p=head,new_head,*q;
        for(int i=1;i<l;i++) p=p->next;
        h1=head;
        h2=p->next;
        p->next=NULL;
        merge_sort(h1,l);
        merge_sort(h2,r);
        p=&new_head;
        new_head.next=NULL;
        while(h1||h2){
            if(h2==NULL||(h1&&(h1->val<=h2->val))){
                p->next=h1;
                p=h1;
                h1=h1->next;
            }else{
                p->next=h2;
                p=h2;
                h2=h2->next;
            }
        }
        return new_head.next;
    }
    ListNode* sortList(ListNode* head) {
        int n=getLength(head);
        return merge_sort(head,n);
    }
};
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7598533
  • 你也可以参考下这篇文章:【c++分治算法解决归并排序】归并排序(图解+代码)
  • 您还可以看一下 朱有鹏老师的朱老师C++第2部分-2.3.C++继承和多态特性课程中的 2.3.19.纯虚函数与抽象类1小节, 巩固相关知识点
  • 除此之外, 这篇博客: 爱上c++的第一天:内存存储模型,引用和函数方面的知识中的 一.代码区:存放函数体的二进制代码,由操作系统进行管理 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    问题的描述中提到了代码相关的截图,但是没有提供具体的代码。无法根据截图分析错误所在。建议提供相关的代码片段或者完整的代码,以便更好地帮助解决问题。

    如果你确定归并排序的实现有问题,可以提供归并排序的相关代码,这样可以更具体地分析错误所在。归并排序的一般步骤如下: 1. 分解:将数组递归地分解为两个子数组,直到子数组长度为1。 2. 合并:将两个已经排序好的子数组合并为一个新的有序数组。

    参考归并排序的C++实现代码如下所示:

    #include <vector>
    
    void merge(std::vector<int>& nums, int start, int mid, int end) {
        std::vector<int> temp(end - start + 1);
        int i = start, j = mid + 1, k = 0;
    
        while (i <= mid && j <= end) {
            if (nums[i] <= nums[j]) {
                temp[k++] = nums[i++];
            } else {
                temp[k++] = nums[j++];
            }
        }
    
        while (i <= mid) {
            temp[k++] = nums[i++];
        }
    
        while (j <= end) {
            temp[k++] = nums[j++];
        }
    
        for (i = start, k = 0; i <= end; i++, k++) {
            nums[i] = temp[k];
        }
    }
    
    void mergeSort(std::vector<int>& nums, int start, int end) {
        if (start < end) {
            int mid = (start + end) / 2;
            mergeSort(nums, start, mid);
            mergeSort(nums, mid + 1, end);
            merge(nums, start, mid, end);
        }
    }
    

    这段代码中,merge函数用于合并两个已排序的子数组,mergeSort函数用于递归地对数组进行分解和排序。

    如果问题与归并排序的具体实现有关,你可以检查以下几个方面: 1. 数组索引越界:确保在访问数组元素时不会越界。 2. 归并操作:在合并两个有序子数组时,处理边界情况(其中一个子数组已经合并完)。 3. 递归调用:检查递归调用是否正确,并确保递归终止条件正确。

    如果以上提示依然不能解决你的问题,请提供具体的代码片段或完整代码,并说明你的预期结果以及实际结果的差异,以便更好地帮助你解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632