一、结构体的定义
typedef int DataType;
typedef struct ListNode//定义结点
{
DataType data;
struct ListNode* next;
}ListNode,*PListNode;
typedef struct PList//定义一个成员是指向结点的指针的结构体
{
PListNode PHead;
}PList,*PList;
二、函数实现
(1)合并两个有序链表(非递归)
//7.合并两个有序链表(非递归)
PListNode ConnectList(PList PList1,PList PList2)
{
PListNode cur1=NULL;//用于遍历链表PList1
PListNode cur2=NULL;//用于遍历链表PList2
PListNode NewHead=NULL;//指向新链表的第一个结点的指针(一旦确定就不动)
PListNode tail=NULL;//新链表的尾指针(每次连接一个新结点,更新一次)
assert(PList1&&PList2);
cur1=PList1->PHead;
cur2=PList2->PHead;
//1.如果两个链表相等(即就是说合并一个链表),包括两个链表都是空,返回任意一个
if (PList1->PHead==PList2->PHead)
{
return PList1->PHead;
}
//2.如果两个链表不相等,且一个为空,返回不为空的链表的头指针;
if (PList1->PHead==NULL)
{
return PList2->PHead;
}
if (PList2->PHead==NULL)
{
return PList1->PHead;
}
//3.确定新链表的头结点
//如果链表1的头结点的值小于链表2,新链表的头指向链表1的第一个结点,尾结点也是第一个结点
//然后更新当前结点;
if (cur1->data<cur2->data)
{
NewHead=cur1;
tail=cur1;
cur1=cur1->next;
}
else
{
NewHead=cur2;
tail=cur2;
cur2=cur2->next;
}
//4.开始比较并且连接
while (cur1&&cur2)//当两个链表同时没有走完时,进去连接
{
if (cur1->data<cur2->data)
{
tail->next=cur1;//给心链表尾部连接结点
tail=tail->next;//更新新链表的尾部
cur1=cur1->next;//更新当前结点的为下一个结点
}
else
{
tail->next=cur2;
tail=tail->next;
cur2=cur2->next;
}
}
//5.等到有一个连接完毕,循环出来
//当一个链表全部元素连接完毕,那么将另一个链表剩下的元素的头连接到新元素的尾
if (cur1==NULL)
tail->next=cur2;
else
tail->next=cur1;
return NewHead;
}
(2)合并两个链表(递归)
//7.1合并两个链表(递归)
PListNode ConnectList1(PListNode PHead1,PListNode PHead2)
{
PListNode cur1=NULL;
PListNode cur2=NULL;
PListNode NewNode=NULL;
cur1=PHead1;
cur2=PHead2;
//1.特殊情况处理
if (PHead1==PHead2)//两个要合并的链表相同(包括两个链表都为空),任意返回一个
{
return PHead1;
}
//只有一个链表空,返回指向不为空的链表的第一个结点的指针
if (PHead1==NULL)
{
return PHead2;
}
if (PHead2==NULL)
{
return PHead1;
}
//2.确定新链表的
if (cur1->data < cur2->data)
{
NewNode=cur1;
cur1=cur1->next;
NewNode->next=ConnectList1(cur1,cur2);
}
else
{
NewNode = cur2;
cur2=cur2->next;
NewNode->next=ConnectList1(cur1,cur2);
}
return NewNode;
}