力扣148,用归并排序!
不知道为什么错了,详情如图,代码在评论区
修改一个地方,h1和h2需要更新一下,如下:
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);
}
};
不知道你这个问题是否已经解决, 如果还没有解决的话:问题的描述中提到了代码相关的截图,但是没有提供具体的代码。无法根据截图分析错误所在。建议提供相关的代码片段或者完整的代码,以便更好地帮助解决问题。
如果你确定归并排序的实现有问题,可以提供归并排序的相关代码,这样可以更具体地分析错误所在。归并排序的一般步骤如下: 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. 递归调用:检查递归调用是否正确,并确保递归终止条件正确。
如果以上提示依然不能解决你的问题,请提供具体的代码片段或完整代码,并说明你的预期结果以及实际结果的差异,以便更好地帮助你解决问题。