本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:
struct ListNode {
int data;
struct ListNode *next;
};
函数接口定义:
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
其中list1和list2是用户传入的两个按data升序链接的链表的头指针;函数mergelists将两个链表合并成一个按data升序链接的链表,并返回结果链表的头指针。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *list1, *list2;
list1 = createlist();
list2 = createlist();
list1 = mergelists(list1, list2);
printlist(list1);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 3 5 7 -1
2 4 6 -1
输出样例:
1 2 3 4 5 6 7
//
大体思路是同时访问两个链表,比较其中数的大小,并新建一个链表将小的值放入,当一个为空时,将不为空链表剩余的数直接放入新建链表中。
如果只想要正确结果
请
到
最
后
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *list1, *list2;
list1 = createlist();
list2 = createlist();
list1 = mergelists(list1, list2);
printlist(list1);
return 0;
}
struct ListNode *createlist()
{
struct ListNode *q,*head,*tail;
head=tail=NULL;
q=(struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d",&q->data);
while(q->data!=-1)
{
if(head==NULL)
{
head=q;
head->next=NULL;
}
if(tail!=NULL)
{
tail->next=q;
}
tail=q;
tail->next=NULL;
q=(struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d",&q->data);
}
return head;
}
以上没有什么问题,裁判实现是没有头节点的链表
。
下面这个函数遇到太多卡壳了
先说错误代码吧
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
struct ListNode *q, *head, *tail;
head = tail =NULL;
q = (struct ListNode*)malloc(sizeof(struct ListNode));
while(list1 != NULL && list2 != NULL)
{
if(list1->data < list2->data)
{
if(head==NULL)
{
head = q;
head->next=NULL;
head->data = list1->data;
}
if(tail!=NULL)
{
tail->data = list1->data;
tail->next=q;
}
tail=q;
tail->next=NULL;
list1=list1->next;
}
else
{
if(head==NULL)
{
head = q;
head->next=NULL;
head->data = list2->data;
}
if(tail!=NULL)
{
tail->data = list2->data;
tail->next=q;
}
tail=q;
tail->next=NULL;
list2=list2->next;
}
q = (struct ListNode*)malloc(sizeof(struct ListNode));
}
if(list2 == NULL)
{
while(list1)
{
tail->data = list1->data;
tail->next=NULL;
q = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->next=q;
tail=q;
list1=list1->next;
}
}
else
{
while(list1)
{
tail->data = list2->data;
tail->next=NULL;
q = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->next=q;
tail=q;
list2=list2->next;
}
}
return head;
}
输出后结果是这样 。。。。我好难
先改前面吧,head为啥指第二个了。
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
struct ListNode *q, *head, *tail;
head = tail =NULL;
q = (struct ListNode*)malloc(sizeof(struct ListNode));
while(list1 != NULL && list2 != NULL)
{
if(list1->data < list2->data)
{
if(head==NULL)
{
head = q;
head->next=NULL;
head->data = list1->data;
}
if(tail!=NULL)
{
tail->next=q;
}
tail=q;
tail->data = list1->data;
tail->next=NULL;
list1=list1->next;
}
else
{
if(head==NULL)
{
head = q;
head->next=NULL;
head->data = list2->data;
}
if(tail!=NULL)
{
tail->next=q; //就错在这
}
tail=q;
tail->data = list2->data;//还有这,这句要放在外面且在tail->q之后。
tail->next=NULL;
list2=list2->next;
}
q = (struct ListNode*)malloc(sizeof(struct ListNode));
}
if(list2 == NULL)
{
while(list1)
{
tail->data = list1->data;
tail->next=NULL;
q = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->next=q;
tail=q;
tail->next=NULL;
list1=list1->next;
}
}
else
{
while(list2)
{
tail->data = list2->data;
tail->next=NULL;
q = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->next=q;
tail=q;
tail->next=NULL;
list2=list2->next;
}
}
return head;
}
改完成这样
那这个0;咋办
改来改去没办法,只好把循环出来的整个都改了
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
struct ListNode *q, *head, *tail;
head = tail =NULL;
q = (struct ListNode*)malloc(sizeof(struct ListNode));
while(list1 != NULL && list2 != NULL)
{
if(list1->data < list2->data)
{
if(head==NULL)
{
head = q;
head->next=NULL;
head->data = list1->data;
}
if(tail!=NULL)
{
tail->next=q;
}
tail=q;
tail->data = list1->data;
tail->next=NULL;
list1=list1->next;
}
else
{
if(head==NULL)
{
head = q;
head->next=NULL;
head->data = list2->data;
}
if(tail!=NULL)
{
tail->next=q;
}
tail=q;
tail->data = list2->data;
tail->next=NULL;
list2=list2->next;
}
q = (struct ListNode*)malloc(sizeof(struct ListNode));
}
while(1)
{
if(list1 == NULL)
{
while(list2 != NULL)
{
q->data = list2->data;
tail->next=q;
tail = q;
tail->next =NULL;
list2=list2->next;
}
}
else
{
while(list1 != NULL)
{
q->data = list1->data;
tail->next=q;
tail = q;
tail->next =NULL;
list1=list1->next;
}
}
break;
}
return head;
}
这下总该好了吧,。。。。。。。。。。。还不行
哦哦哦,小问题,最后忘记开辟空间了
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
struct ListNode *q, *head, *tail;
head = tail =NULL;
q = (struct ListNode*)malloc(sizeof(struct ListNode));
while(list1 != NULL && list2 != NULL)
{
if(list1->data < list2->data)
{
if(head==NULL)
{
head = q;
head->next=NULL;
head->data = list1->data;
}
if(tail!=NULL)
{
tail->next=q;
}
tail=q;
tail->data = list1->data;
tail->next=NULL;
list1=list1->next;
}
else
{
if(head==NULL)
{
head = q;
head->next=NULL;
head->data = list2->data;
}
if(tail!=NULL)
{
tail->next=q;
}
tail=q;
tail->data = list2->data;
tail->next=NULL;
list2=list2->next;
}
q = (struct ListNode*)malloc(sizeof(struct ListNode));
}
while(1)
{
if(list1 == NULL)
{
while(list2 != NULL)
{
q->data = list2->data;
tail->next=q;
tail = q;
tail->next =NULL;
list2=list2->next;
q = (struct ListNode*)malloc(sizeof(struct ListNode));//忘记写
}
}
else
{
while(list1 != NULL)
{
q->data = list1->data;
tail->next=q;
tail = q;
tail->next =NULL;
list1=list1->next;
q = (struct ListNode*)malloc(sizeof(struct ListNode));//忘记写
}
}
break;
}
return head;
}