思路:用一个指针p1指向第一个链表,用一个指针p2指向第二个链表,比较俩个指针指向节点的值,哪个小把那个放进去,指针后移一位,当某个指针指向的链表为空,则另一个链表剩余部分直接连上即可
#include <iostream>
using namespace std;
typedef struct LNode * List;
struct LNode
{
int data;
struct LNode * next;
};
List ReadList();
List Combine(List L1, List L2);
void PrintList(List L);
int main()
{
List L1, L2, L;
L1 = ReadList();
L2 = ReadList();
L = Combine(L1, L2);
PrintList(L);
return 0;
}
List ReadList()
{
List L, p, head;
L = (List)malloc(sizeof(struct LNode));
L->next = NULL;//L是空头节点
head = L;
int e;
while(~scanf("%d", &e))
{
if(e == -1)
break;
p = (List)malloc(sizeof(struct LNode));
p->next = NULL;
p->data = e;
L->next = p;
L = L->next;
}
L = head->next;
free(head);
return L;
}
void PrintList(List L)
{
if(L == NULL)
printf("NULL\n");
else
{
printf("%d", L->data);
L=L->next;
while(L)
{
printf(" %d", L->data);
L = L->next;
}
printf("\n");
return;
}
}
List Combine(List L1, List L2)
{
List p1, p2, L, head;
p1 = L1, p2 = L2;
L = (List)malloc(sizeof(struct LNode));
L->next = NULL;
head = L;
while(p1 && p2)//p1指向的节点不为空并且p2指向的节点不为空
{
if(p1->data <= p2->data)//p1指向的节点元素比p2指向的节点元素小,则L指向p1,否则指向p2
{
L->next = p1;
L = L->next;
p1 = p1->next;
}
else
{
L->next = p2;
L = L->next;
p2 = p2->next;
}
}
if(p1)//第一个链表还有剩余部分,直接接上去
{
L->next = p1;
}
if(p2)//第二个链表还有剩余部分,直接接上去
{
L->next = p2;
}
L = head->next;
free(head);
return L;
}