第一步:找到合并后链表的第一个结点
两个有序链表中,把第一个结点数据小的作为合并后链表的第一个结点
第二步:哪个结点的数据小哪个结点就尾插到合并后的链表中
比较两个链表中结点数据大小,数据小的结点尾插到合并后的链表中,同时该结点向后走,直到两个链表中有一个为空。
第三步:将仍有结点的链表尾插到合并后的链表中
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
typedef int DataType;
typedef struct SListNode
{
DataType data;
struct SListNode* pNext;
}SListNode;
//申请新空间
SListNode *BuyNewNode( DataType data)
{
SListNode *pNewNode = (SListNode *)malloc(sizeof(SListNode));
assert(pNewNode);
pNewNode->data = data;
pNewNode->pNext = NULL;
return pNewNode;
}
//初始化
void SListInit(SListNode **ppFirst)
{
*ppFirst = NULL;
}
//打印函数
void SListNodePrint(SListNode **ppFirst)
{
SListNode *pNode = NULL;
for (pNode = *ppFirst; pNode != NULL; pNode = pNode->pNext)
{
printf("%d ->", pNode->data);
}
printf(" NULL\n");
}
//尾插
void SListPushBack(SListNode **ppFirst, DataType data)
{
SListNode *pNode = BuyNewNode(data);
SListNode *pTail = *ppFirst;
if (*ppFirst == NULL)
{
*ppFirst = pNode;
return;
}
while (pTail->pNext)
{
pTail = pTail->pNext;
}
pTail->pNext = pNode;
}
//合并两个有序链表,合并后依然有序
SListNode *MergeSList(SListNode *list1, SListNode *list2)
{
SListNode *list = NULL;
SListNode *pTail;
if (list1 == NULL)
return list2;
if (list2 == NULL)
return list1;
if (list1->data < list2->data)
{
list = list1;
list1 = list1->pNext;
}
if (list2->data < list1->data)
{
list = list2;
list2 = list2->pNext;
}
pTail = list;
while (list1 && list2)
{
if (list1->data < list2->data)
{
pTail->pNext = list1;
pTail = list1;
list1 = list1->pNext;
}
if (list2->data < list1->data)
{
pTail->pNext = list2;
pTail = list2;
list2 = list2->pNext;
}
}
if (list1)
{
pTail->pNext = list1;
}
if (list2)
{
pTail->pNext = list2;
}
return list;
}