两个有序链表合并为一个升序链表,函数是正确的,但用code block运行结果出错,请大家帮忙看看是不是mian里哪里有问题呢?
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode*hebing(struct ListNode*list1,struct ListNode*list2)
{
struct ListNode*a,*b;
a=(struct ListNode*)malloc(sizeof(struct ListNode));
b=a;
while(list1&&list2)
{
if(list1->val->val)
{
b->next=list1;
b=list1;
list1=list1->next;
}
else
{
b->next=list2;
b=list2;
list2=list2->next;
}
}
if(list1)
b->next=list1;
else
b->next=list2;
return a->next;
}
void printOut(struct ListNode *L) {
struct ListNode *p = L->next;
while (p) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
void create(struct ListNode *L, int X) {
struct ListNode *t = (struct ListNode *)malloc(sizeof(struct ListNode));
t->val = X;
t->next = L->next;
L->next = t;
}
int main()
{
struct ListNode*list1,*list2,*he;
list1=(struct ListNode*)malloc(sizeof(struct ListNode));
list2=(struct ListNode*)malloc(sizeof(struct ListNode));
he=(struct ListNode*)malloc(sizeof(struct ListNode));
he->next=NULL;
list1->next = NULL;
list2->next = NULL;
int a[] = {1,2,4};
int b[]={1,3,4};
int k;
for (k = 0; k < 3; k++)
create(list1, a[2- k]);
printOut(list1);
for (k = 0; k < 3; k++)
create(list2, b[2- k]);
printOut(list2);
printOut(hebing(list1,list2));
}
错误结果如图:
修改处见注释,供参考:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode*hebing(struct ListNode*list1,struct ListNode*list2)
{
struct ListNode*a,*b;
a=(struct ListNode*)malloc(sizeof(struct ListNode));
b=a;
list1 = list1->next; //修改
list2 = list2->next; //修改
while(list1&&list2)
{
if(list1->val<list2->val)
{
b->next=list1;
b=list1;
list1=list1->next;
}
else
{
b->next=list2;
b=list2;
list2=list2->next;
}
}
if(list1)
b->next=list1;
else
b->next=list2;
return a; //a->next; 修改
}
void printOut(struct ListNode *L) {
struct ListNode *p = L->next;
while (p) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
}
void create(struct ListNode *L, int X) {
struct ListNode *t = (struct ListNode *)malloc(sizeof(struct ListNode));
t->val = X;
t->next = L->next;
L->next = t;
}
int main()
{
struct ListNode*list1,*list2,*he;
list1=(struct ListNode*)malloc(sizeof(struct ListNode));
list2=(struct ListNode*)malloc(sizeof(struct ListNode));
he=(struct ListNode*)malloc(sizeof(struct ListNode));
he->next=NULL;
list1->next = NULL;
list2->next = NULL;
int a[] = {1,2,4};
int b[]={1,3,4};
int k;
for (k = 0; k < 3; k++)
create(list1, a[2- k]);
printOut(list1);
for (k = 0; k < 3; k++)
create(list2, b[2- k]);
printOut(list2);
printOut(hebing(list1,list2));
return 0;
}
你的代码中,a 和 b 都是指向动态分配的内存空间的指针,但是最后并没有释放这些内存空间。
这可能是导致出错的原因之一,你可以在函数执行完毕后释放 a 和 b 所指向的内存空间。
struct ListNode*hebing(struct ListNode*list1,struct ListNode*list2)
{
struct ListNode*a,*b;
a=(struct ListNode*)malloc(sizeof(struct ListNode));
b=a;
while(list1&&list2)
{
if(list1->val<list2->val)
{
b->next=list1;
b=list1;
list1=list1->next;
}
else
{
b->next=list2;
b=list2;
list2=list2->next;
}
}
if(list1)
b->next=list1;
else
b->next=list2;
struct ListNode *res = a->next;
free(a);
return res;
}