1. 问题描述:
A和B是两个单链表(带有表头节点),其中元素是递增有序的,设计一个算法,将A和B归并成一个按元素值非递减有序的链表C,C由链表A和B的节点组成
2. 思路分析:
① 因为A和B都是递增有序的,要使归并后的链表还是有序的,可以从A和B中挑选出最小的元素,插入到C的尾部,这样当A和B中的元素都插入到C中的时候一定是有序的,所以需要定义两个指针分别指向链表A和链表B,这样才可以对指向的链表的元素进行移动
② 有可能我们在最后的时候有一个链表元素都被遍历完了,另外一个还有没有遍历完的元素那么这个时候需要判断一下,将指向链表C指针的next指针指向剩余的另外一个链表没有被遍历完的元素的起始位置
③ 需要注意的一个问题是我们在全局中声明了三个指针变量,而且我们需要在合并函数执行完了之后那么主函数中链表C是同步修改的,也就是我们在主函数中可以得到合并的链表这样就可以对链表进行遍历,这个时候在合并的方法中需要传入一个引用(*&C),也就是像下面这样,这样在主函数中得到的才是合并后的链表,假如没有加上这个引用那么链表C还是一个空的链表
void merge(LNode *A, LNode *B, LNode *&C){
}
3. 具体的代码如下:
使用for循环来创建的链表:
#include<stdio.h>
#include<malloc.h>
typedef struct LNode{
int data;
LNode *next;
}LNode;
LNode *A, *B, *C;
void merge(LNode *A, LNode *B, LNode *&C){
LNode *p = A->next;
LNode *q = B->next;
LNode *r;
C = A;
C->next = NULL;
free(B);
r = C;
while(p != NULL && q != NULL){
if(p->data <= q->data){
r->next = p;
p = p->next;
r = r->next;
}
else{
r->next = q;
q = q->next;
r = r->next;
}
}
r->next = NULL;
if(p != NULL){
r->next = p;
}
if(q != NULL){
r->next = q;
}
}
void createLinkList(){
LNode *pa;
LNode *pb;
//创建AB链表的头结点
A = (LNode*)malloc(sizeof(LNode));
B = (LNode*)malloc(sizeof(LNode));
pa = A;
pb = B;
//一开始的是要将其指针域赋值为空
pa->next = NULL;
pb->next = NULL;
for(int i = 1; i <= 20; i += 4){
LNode *newNode = (LNode*)malloc(sizeof(LNode));
newNode->data = i;
pa->next = newNode;
pa = pa->next;
}
pa->next = NULL;
for(int i = 2; i <= 8; i += 2){
LNode *newNode = (LNode*)malloc(sizeof(LNode));
newNode->data = i;
pb->next = newNode;
pb = pb->next;
}
pb->next = NULL;
}
int main(void){
createLinkList();
merge(A, B, C);
LNode *p = C;
while(p->next != NULL){
printf("%d ", p->next->data);
p = p->next;
}
return 0;
}
直接手动创建链表:
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct LNode{
int data;
LNode *next;
}LNode;
LNode *A, *B, *C;
void merge(LNode *A, LNode *B, LNode *&C){
LNode *p = A->next;
LNode *q = B->next;
LNode *r;
C = A;
C->next = NULL;
free(B);
r = C;
while(p != NULL && q != NULL){
if(p->data <= q->data){
r->next = p;
p = p->next;
r = r->next;
}
else{
r->next = q;
q = q->next;
r = r->next;
}
}
r->next = NULL;
if(p != NULL){
r->next = p;
}
if(q != NULL){
r->next = q;
}
}
void createLinkList(){
// headA与headB是用来调试的
LNode *t1, *headA;
LNode *t2, *headB;
A = (LNode*)malloc(sizeof(LNode));
B = (LNode*)malloc(sizeof(LNode));
t1 = A;
headA = A;
t2 = B;
headB = B;
A->next = NULL;
B->next = NULL;
LNode *A1 = (LNode*)malloc(sizeof(LNode));
A1->data = 1;
LNode *A3 = (LNode*)malloc(sizeof(LNode));
A3->data = 3;
LNode *A5 = (LNode*)malloc(sizeof(LNode));
A5->data = 5;
LNode *A7 = (LNode*)malloc(sizeof(LNode));
A7->data = 7;
LNode *A9 = (LNode*)malloc(sizeof(LNode));
A9->data = 9;
A9->next = NULL;
t1->next = A1;
t1 = t1->next;
t1->next = A3;
t1 = t1->next;
t1->next = A5;
t1 = t1->next;
t1->next = A7;
t1 = t1->next;
t1->next = A9;
t1 = t1->next;
LNode *B2 = (LNode*)malloc(sizeof(LNode));
B2->data = 2;
LNode *B4 = (LNode*)malloc(sizeof(LNode));
B4->data = 4;
LNode *B6 = (LNode*)malloc(sizeof(LNode));
B6->data = 6;
LNode *B8 = (LNode*)malloc(sizeof(LNode));
B8->data = 8;
B8->next = NULL;
t2->next = B2;
t2 = t2->next;
t2->next = B4;
t2 = t2->next;
t2->next = B6;
t2 = t2->next;
t2->next = B8;
}
int main(void){
createLinkList();
merge(A, B, C);
LNode *p = C;
while(p->next != NULL){
printf("%d ", p->next->data);
p = p->next;
}
return 0;
}