题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
分析:
//将两个单调链表合并成一个链表
//两个链表长度相同、q1对q2长,q2比q1长,是否为空;
// 先考虑两个链表长度相同,之后在考虑链表长度不一样
思路:
完整代码
代码还有点问题,待调试
#include<stdio.h>
#include<malloc.h>
/*单链表实现:合并两个排序的链表*/
typedef struct Link
{
char elem; //代表数据域
struct Link * next; //代表指针域,指向直接后继元素
}link;
link *init();
link *init2();
link *combine();
int main(){
link *phead1;
phead1 = init();
link *phead2 = init2();
link *phead = combine(phead1,phead2);
while(phead != NULL){
// phead = phead->next;
printf("%d\n",phead->elem);
phead = phead->next;
}
return 0;
}
link *init(){
link *head = (link *)malloc(sizeof(link));
head->next = NULL;
link *temp = head;
int i;
for(i=1;i<8;)
{
link *body = (link *)malloc(sizeof(link));
body->next = NULL;
body->elem = i;
i=i+2;
temp->next = body;
// printf("p1:%d ",temp->elem);
temp= temp->next;
printf("p1:%d ",temp->elem);
}
return head;
}
link *init2(){
link *head = (link *)malloc(sizeof(link));
head->next = NULL;
link *temp = head;
int i;
for(i=0;i<8;)
{
link *body = (link *)malloc(sizeof(link));
body->next = NULL;
body->elem = i+2;
i=i+2;
temp->next = body;
temp= temp->next;
printf("p2:%d ",temp->elem);
}
return head;
}
link *combine(link *q1,link *q2){
link *q = (link *)malloc(sizeof(link));
q->next = NULL;
link *temp = q;
int flag = 0;
//将两个单调链表合并成一个链表
//两个链表长度相同、q1对q2长,q2比q1长,是否为空;
// 先考虑两个链表长度相同,之后在考虑链表长度不一样
if(q1 == NULL){
return q2;
}
if(q2 == NULL){
return q1;
}
// 先确定头结点
while(q1 && q2){
if(q1->elem <= q2->elem){
//初始化结点
link *body = (link *)malloc(sizeof(link));
body->next = NULL;
body->elem = q1->elem;
//新增结点
temp->next = body;
//指向下一个结点
temp = temp->next;
flag = 0;
}
else{
link *body = (link *)malloc(sizeof(link));
body->next = NULL;
body->elem = q2->elem;
temp->next = body;
temp = temp->next;
flag = 1;
}
if(flag == 0){
q1 = q1->next;
} else{
q2 = q2->next;
}
}
return q;
}
结果