已知带头结点的有序链表head_a,head_b。合并两个链表到head_a,要求依然有序。图示第一、二行为输入,表示建立链表(0表示结束,不包含在链表)。第三行为输出。如果输入序列不能使链表为有序,则输出链表无序(注:当输入5 3 7 1 9 0时,建立的链表为1 3 5 7 9)。请在/******start******/和/******end******/注释行中间完成相关代码。
思路:先进行指针判空,分配内存等操作,再判断l1,l2是否有序。用l3存储正确顺序,最后l1指向l3的第一个结点。
-
先写思路再做题
-
注意相同元素的情况
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
typedef struct _node
{
int data;
struct _node* next;
} node;
node* create(); //建立带头结点的链表
void out(node* head); //输出链表
int merge(node* la, node* lb); //将la,lb链表合并到la,依然保证升序
int main(void)
{
int result;
node* head_a, * head_b;
printf("Input: ");
head_a = create();
head_b = create();
result = merge(head_a, head_b);
printf("Output: ");
if (result == 0)
{
printf("One link is disorder!\n");
}
else
{
out(head_a);
}
return 0;
}
node* create()
{
int n, i;
node* head, * p, * q;
head = (node*)malloc(sizeof(node));
head->next = NULL;
q = head;
i = 0;
scanf("%d", &n);
while (n != 0)
{
p = (node*)malloc(sizeof(node));
p->data = n;
if (i % 2)//奇数前插
{
p->next = head->next;
head->next = p;
}
else//偶数尾插
{
p->next = q->next;
q->next = p;
q = q->next;
}
i++;
scanf("%d", &n);
}
return head;
}
void out(node* head)
{
node* p = head->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
/******start******/
int merge(node* la, node* lb) {
int i, j;
node* p = la->next, * s = la->next;//s用来遍历表la,lb
node* q = lb->next, * tmp, * tmp2=NULL;
tmp = (node*)malloc(sizeof(node));//表三头结点
tmp2 = tmp;//指向表三
if ((tmp == NULL)||(p==NULL)||(q==NULL)) {
return 0;
}
while (s->next != NULL ) {
if (s->data > s->next->data ) {
return 0;//无序
}
else {
s = s->next;
}
}
s = q;
while (s->next != NULL) {
if (s->data > s->next->data) {
return 0;//无序
}
else {
s = s->next;
}
}
while (p != NULL && q!= NULL) {
if (p->data > q->data) {
tmp2->next = q;
tmp2 = q;
q = q->next;
}
else if (p->data < q->data) {
tmp2->next = p;
tmp2 = p;
p = p->next;
}
else {
tmp2->next = p;
tmp2 = p;
p = p->next;
tmp2->next = q;
tmp2 = q;
q = q->next;
}
}
if (p == NULL) {
tmp2->next = q;
}
else if (q == NULL) {
tmp2->next = p;
}
la->next = tmp->next;
return 1;
}
/******end******/