算法-连接两条排序的链表

之前在牛客网上面做的题目,感觉对自己很有帮助,而且以后面试可能会用到,整理了两种方法,递归的和非递归的,同时也是对代码再一次巩固了。

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;
		}
	}
};


猜你喜欢

转载自blog.csdn.net/wujiafei_njgcxy/article/details/77433891
今日推荐