Problem Description
分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。
Input
第一行输入M与N的值;
第二行依次输入M个有序的整数;
第三行依次输入N个有序的整数。
Output
输出合并后的单链表所包含的M+N个有序的整数。
Example Input
6 5
1 23 26 45 66 99
14 21 28 50 100
Example Output
1 14 21 23 26 28 45 50 66 99 100
Hint
不得使用数组!
解题思路1
建立新链,将旧链上的数据通过中间节点t传递到新链上。
代码1
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
}NODE;
int main()
{
NODE *L1 = (NODE *)malloc(sizeof(NODE));
NODE *L2 = (NODE *)malloc(sizeof(NODE));
NODE *L3 = (NODE *)malloc(sizeof(NODE));
L1->next = NULL;
L2->next = NULL;
L3->next = NULL;
NODE *p=L1 ,*pa,*pb,*pc;
int m, n;
scanf("%d %d", &m, &n);
while (m--)//新建链
{
NODE *s = (NODE *)malloc(sizeof(NODE));
scanf("%d", &s->data);
s->next = p->next;
p->next = s;
p = s;
}
p = L2;
while (n--)//新建链
{
NODE *s = (NODE *)malloc(sizeof(NODE));
scanf("%d", &s->data);
s->next = p->next;
p->next = s;
p = s;
}
/*p = L1->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
p = L2->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}*/
pa = L1->next, pb = L2->next, pc = L3;//pa表示L1链的当前位置,pb表示L2链的当前位置,pc表示新链的当前位置
while (pa&&pb)
{
if (pa->data <= pb->data)
{
NODE *t = (NODE *)malloc(sizeof(NODE));
t->next = pc->next;//t是新链上的新节点
t->data = pa->data;
pa = pa->next;
pc->next = t;
pc = t;
}
else if (pa->data > pb->data)
{
NODE *t = (NODE *)malloc(sizeof(NODE));
t->next = pc->next;
t->data = pb->data;
pb = pb->next;
pc->next = t;
pc = t;
}
}
//对剩余链的处理
while (pa)
{
NODE *t = (NODE *)malloc(sizeof(NODE));
t->next = pc->next;
t->data = pa->data;
pa = pa->next;
pc->next = t;
pc = t;
}
while (pb)
{
NODE *t = (NODE *)malloc(sizeof(NODE));
t->next = pc->next;
t->data = pb->data;
pb = pb->next;
pc->next = t;
pc = t;
}
p = L3->next;
while (p)
{
//printf("apple");
if (!p->next)
printf("%d\n", p->data);
else
printf("%d ", p->data);
p = p->next;
}
return 0;
}
解题思路2
以第一条链的头结点L1为新链的头结点,按顺序将旧链上的节点链接上来。
代码2
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
}NODE;
int main()
{
NODE *L1 = (NODE *)malloc(sizeof(NODE));
NODE *L2 = (NODE *)malloc(sizeof(NODE));
L1->next = NULL;
L2->next = NULL;
NODE *p=L1 ,*pa,*pb,*pc,*q;
int m, n;
scanf("%d %d", &m, &n);
while (m--)//新建链
{
NODE *s = (NODE *)malloc(sizeof(NODE));
scanf("%d", &s->data);
s->next = p->next;
p->next = s;
p = s;
}
p=L2;
while (n--)//新建链
{
NODE *s = (NODE *)malloc(sizeof(NODE));
scanf("%d", &s->data);
s->next = p->next;
p->next = s;
p = s;
}
/*p = L1->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
p = L2->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}*/
pa=L1->next;
pb=L2->next;
pc=L1;
while(pa&&pb)
{
if(pa->data<=pb->data)//将pa指向的节点插入到pc的后面
{
//pa->next=pc->next;
pc->next=pa;
pc=pa;
pa=pa->next;
}
else //将pb指向的节点插入到pc的后面
{
//pb->next=pc->next;
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
//接下来剩余链处理
if(pa)//pa不为空的情况
{
//pa->next=pc->next;
pc->next=pa;
}
else//pb不为空的情况
{
//printf("apple");
//pb->next=pc->next;
pc->next=pb;
}
//接下来释放无用结点(另一个头结点即L2)
free(L2);
q=L1->next;
while (q)
{
//printf("apple");
if (!q->next)
printf("%d\n", q->data);
else
printf("%d ", q->data);
q = q->next;
}
return 0;
}