之前在牛客网上面做的题目,感觉对自己很有帮助,而且以后面试可能会用到,整理了两种方法,递归的和非递归的,同时也是对代码再一次巩固了。
ok,第一种,用递归实现!
class Solution
{
ListNode * Merge(ListNode* pHead1, ListNode *pHead2)
{
if (pHead1 == NULL) //如果pHead1当前指向的节点为空返回当前pHead2指向的节点
{
return phead2;
}
if (pHead2 == NULL)
{
return pHead1; //如果pHead2当前指向的节点为空返回当前pHead1指向的节点
}
if (pHead1->val < pHead2->val)//如果两个节点当前指向的都不为空的话那么就比较
{
pHead1->next = Merge(pHead1->next, pHead2); //如果pHead1大,那么下一个节点将从pHead1->next和pHead2决出
return pHead1; //第一次比较的头结点决定最后返回哪个头结点
}
else
{
pHead2->next = Merge(pHead1, pHead2->next); //如果pHead2大,那么下一个节点将从pHead和pHead2->next决出
return pHead2;
}
}
};
第二种,非递归算法。
class Solution
{
ListNode * Merge(ListNode * pHead1, ListNode *pHead2)
{
ListNode * cur = NULL; //当前结点位置
ListNode * result = NULL; //最后返回的头结点
if (pHead1 == NULL)
{
return pHead2;
}
if (pHead2 == NULL)
{
return pHead1;
}
while (pHead1 != NULL && pHead2 != NULL)//两个头结点同时都不为空
{
if (pHead1->val < pHead2->val)
{
if (result == NULL) //如果当前result为空那么当前节点和最后头结点都为pHead1
{
cur = result = pHead1;
}
else //如果不空那么当前节点的下一个肯定是这次比较小的那个
{
cur->next = pHead1;
cur = cur->next;
}
pHead1 = pHead1->next; //pHead则需要往后遍历一个
}
else
{
if (pHead1->val > pHead2->val)
{
if (result == NULL)
{
cur = result = pHead2;
}
else
{
cur->next = pHead2;
cur = cur->next;
}
pHead2 = pHead2->next;
}
}
}
if (pHead1 == NULL) //退出while循环后如果某一条链表还没有完全遍历则把cur指向
{
cur->next = pHead2;
}
if (pHead2 == NULL)
{
cur->next = pHead1;
}
}
};