L1:1 2 3 4 5
L2:6 7 8 9 10
合并后:1 6 2 7 3 8 4 9 5 10
#include <iostream>
using namespace std;
typedef struct List node;
struct List
{
int data;
struct List* next;
};
//insert at tail
void insert(node* &L, int num) {
node* p = new node;
p->data = num;
p->next = NULL;
L->next = p;
L = p;
}
//print list
void print_list(const node* L) {
while (L) {
cout << L->data << " ";
L = L->next;
}
cout <<endl <<"---------------------------------------"<<endl;
}
int main()
{
node* L1 = new node;
node* L2 = new node;
L1->data = 0;
L2->data = 10;
L1->next = NULL;
L2->next = NULL;
node* tail_1 = L1;//记录尾结点
node* tail_2 = L2;//记录尾结点
for (int i = 1; i < 10; i++) {
insert(tail_1, i);
}
for (int i = 11; i < 22; i++) {
insert(tail_2, i);
}
print_list(L1);
print_list(L2);
node *p1 = L1;
node *q1 = L2;
node *p2, *q2,*temp;
temp = NULL;
//---------------------核心代码-------------------------
while (q1&&p1) {
q2 = q1->next;
p2 = p1->next;
p1->next = q1;
q1->next = p2;
temp = p1; //temp是记录L1每时刻的尾结点位置,防止L2长度大于L1,退出循环时L2中仍有结点为插入L1中
p1 = p2;
q1 = q2;
}
//以下是L2长度大于L1时的情况 将L2中比L1长的部分直接接在L1后面
if (!p1) {
temp->next = q1;
}
//---------------------核心代码-------------------------
//以下为打印合并后的链表
print_list(L1);
return 0;
}