题目:
输入两个递增序列的链表, 合并这两个链表使新链表中的序列仍是递增的。
结点结构定义:
typedef struct Node
{
int val_;
struct Node *next;
}Node;
思路:
定义链表1, 链表2, 可以将链表1作为主体链表(即将链表2中的结点依次插入链表1中)
对链表1定义两个指针, 初始值为pPre1 = NULL, pCur1 = pHead1;
对链表2定义两个指针,初始值为pPre2 = NULL, pCur2 = pHead2;
判断: ①当pCur1->val_ 小于pCur2->val_时, pPre1 = pCur1, pCur1 = pCur1->next(即pPre1与pCur1一直往后移),直到pCur1->val_>=pCur2->val_停止,此时
pPre1->val_ < pCur1->val_ 且 pCur1->val_ >= pCur2->val_ ,先不管这俩指针, 一会会将链表2的部分数据插入到这俩指针之间
②pCur2->val_肯定是小于等于pCur2->val_的,即它肯定要插入pPre1与pCur1之间, 将pCur2作标记 pBegin2 = pCur2; 接着pPre2与pCur2一直往后移,直到
pCur2->val_ > pCur1->val 停止。
③ 最终会将pBegin2与pPre2之间的数据 插入到pPre1与pCur1之间
代码:
Node *Merge(Node *pHead1, Node *pHead2)
{
if (!pHead1 && !pHead2)
return NULL;
if (!pHead1 && pHead2) //链表2与空链表合并
return pHead2;
if (pHead1 && !pHead2)
return pHead1;
Node *pRet = pHead1; //合并后的链表头结点, 默认为链表1的头结点
Node *pPre1 = NULL;
Node *pCur1 = pHead1;
Node *pPre2 = NULL;
Node *pCur2 = pHead2;
while (pCur1 && pCur2)
{
if (pCur1->val_ < pCur2->val_) //pPre1与pCur1后移, 直到pCur1->val_ > pCur1->val_
{
pPre1 = pCur1;
pCur1 = pCur1->next;
continue;
}
Node *pBegin2 = pCur2; //作标记
while (pCur2 && pCur2->val_ <= pCur1->val_) // 查找 大于pPre1小于等于 pCur1之间的数据
{
pPre2 = pCur2;
pCur2 = pCur2->next;
}
// pPre1 pCur1 pBegin2 pPre2都已经找到,开始插入
pPre2->next = pCur1;
if (pPre1)
{
pPre1->next = pBegin2;
}else // 这种情况是刚开始pCur1指向的值 大于 pCur2的值, 此时要将pBegin2与pPre2之间的数据插入到pCur1之前, 且合并后头结点指针为pBegin2
{
pRet = pBegin2;
pPre1 = pCur1;
}
}
if (!pCur1 && pCur2) // 有可能链表1已经结束,但是链表2依然有值, 此时只要将pPre1->next = pCur2即可
{
pPre1->next = pCur2;
}
return pRet;
}