6-4 链表拼接 (20分)

本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:


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;
}

点个赞再走呗!☞

发布了108 篇原创文章 · 获赞 114 · 访问量 8590

猜你喜欢

转载自blog.csdn.net/weixin_45773503/article/details/103827781
今日推荐