将来个排好序的链表合并为一个链表,使用一个临时指针,接着使用两个指向两个链表的头的指针,然后比较这两个链表节点的数据大小,临时指针指向小的节点,更新指向小的链表头的指针使其指向下一个节点。重复此过程直到其中一个链表遍历完毕,另一个没有遍历完的链表插到链表尾即可实现两个链表的合并。具体的实现代码如下:
//此程序用于实现两个排好序的链表的合并
#include<iostream>
#include<stdlib.h>
struct LinkNode {
int val;
LinkNode* nextnode;
LinkNode(int x) :val(x), nextnode(NULL) { }
};
/*LinkNode* Merge1(LinkNode* l1, LinkNode* l2) {//实现两个排好序的链表的和并(并未使用临时头节点)
LinkNode* temphead =NULL;//临时头指针
//刚开始排序时临时头结点的情形
if (l1->val < l2->val) {
temphead = l1;
l1 = l1->nextnode;
}
else {
temphead = l2;
l2 = l2->nextnode;
}
LinkNode *tempnode=temphead;
while (l1 && l2) {
if (l1->val < l2->val) {
tempnode->nextnode = l1;
l1 = l1->nextnode;
}
else {
tempnode->nextnode = l2;
l2 = l2->nextnode;
}
tempnode = tempnode->nextnode;
}
if (l1) {
tempnode->nextnode = l1;
}
if(l2) {
tempnode->nextnode = l2;
}
return temphead;
}*/
LinkNode* Merge2(LinkNode* l1, LinkNode* l2) {//使用临时头节点来实现两个排好序连接表的合并
LinkNode temphead(0);
LinkNode* pre = &temphead;
while (l1 && l2) {
if (l1->val < l2->val) {
pre->nextnode = l1;
l1 = l1->nextnode;
}
else {
pre->nextnode = l2;
l2 = l2->nextnode;
}
pre = pre->nextnode;
}
if (l1) {
pre->nextnode = l1;
}
else {
pre->nextnode = l2;
}
return temphead.nextnode;
}
void print(LinkNode* l){
while (l) {
printf("[%d] ", l->val);
l = l->nextnode;
}
printf("\n");
}
int main() {
LinkNode a(1);
LinkNode b(2);
LinkNode c(3);
LinkNode d(4);
LinkNode e(5);
LinkNode f(6);
LinkNode g(7);
LinkNode* l1 = &b;
b.nextnode = &e;
e.nextnode = &f;
LinkNode* l2 = &a;
a.nextnode = &c;
c.nextnode = &d;
d.nextnode=&g;
printf("合并前:\n");
print(l1);
print(l2);
printf("合并后:\n");
//printf("使用Merge1函数:");
//LinkNode* L1 = Merge1(l1, l2);
//print(L1);
printf("使用Merge2函数:");
LinkNode* L2=Merge2(l1, l2);
print(L2);
return 0;
}