两个递增链表→一个递减链表
这道题用了个诡计,在建立La、Lb两个链表时,用的是头插法
比如输入1、2、3、4、5
每次输入新节点都插在头部,最后链表就变成了5、4、3、2、1
然后直接用尾插法归并就可以了
避免了【先归并,再逆置】这么麻烦的做法
或者也可以:先用尾插法输入两个链表,归并时用头插法
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct node
{
int val;
struct node *next;
}*List;
int main()
{
//建立La、Lb两个链表
List La,Lb;
La = (List)malloc(sizeof(struct node));
La->next = NULL;
Lb = (List)malloc(sizeof(struct node));
Lb->next = NULL;
//分别输入两个链表,头插法
//输入的是递增序列,用了头插法就变成了递减序列...
int m,n;
cin>>m>>n;
List tmp;
for(int i=0; i<m; i++) {
tmp = (List)malloc(sizeof(struct node));
cin>>tmp->val;
tmp->next = La->next;
La->next = tmp;
}
for(int i=0; i<n; i++) {
tmp = (List)malloc(sizeof(struct node));
cin>>tmp->val;
tmp->next = Lb->next;
Lb->next = tmp;
}
//归并
List ta=La->next;
List tb=Lb->next;
//建立第三个链表Lc的头节点
List Lc = (List)malloc(sizeof(struct node));
List tc = Lc; //tc始终指向Lc的尾部
while(ta!=NULL && tb!=NULL) {
//如果ta的节点小于tb,就把ta插到Lc的尾部
if(ta->val > tb->val) {
tc->next = ta;
tc = ta;
ta = ta->next;
}
else {
tc->next = tb;
tc = tb;
tb = tb->next;
}
}
//将La或者Lb中剩下的节点全挂到Lc末尾
tc->next = (ta==NULL? tb : ta);
//输出归并后的链表
for(tmp = Lc->next; tmp->next; tmp = tmp->next)
cout<<tmp->val<<' ';
cout<<tmp->val<<endl;
return 0;
}