面试题整理 4 合并两个排序的数组

对于链表,《剑指offer》中感觉有些地方不妥,前面讲过链表的头指针是指向一个指针的指针,即指向头结点的指针的指针。但是后面在链表的使用中输入的头指针只是指向链表的头结点的指针。

后面看《c和指针》时看到单链表这一块,链表的表示时用一个根指针来表示链表的起始位置,根指针指向链表的第一个节点,根指针只是一个指针,不包含任何数据。当我们需要改动链表,如果可能改动根指针,如将根指针改为指向另一个节点,则传参时需要以指针形式传递才可以改动根指针的值,即参数就变为了指向根指针的指针,也是指向第一个节点的指针的指针。而当我们不会改动链表根指针时输入参数不需要输入指针,直接输入根指针就可以了。

题目:合并两个排序的数组

递归的方法:(附上《剑指offer》中的解法)

struct ListNode
{
	int m_nValue;
	ListNode *m_pNext;

};

ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
	if(pHead1 == NULL)
		return pHead2;
	else if(pHead2 == NULL)
		return pHead1;

	ListNode* pMergedHead = NULL;

	if(pHead1->m_nValue < pHead2->m_nValue)
	{
		pMergedHead = pHead1;
		pMergedHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
	}
	else
	{
		pMergedHead = pHead2;
		pMergedHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
	}

	return pMergedHead;
}

循环的方法:(在这里我写了一个循环的方法,这里还是输入参数为指向头结点的指针,因为原列表的头指针可以不变,但此时实际上链表1和链表2已经不是原来的链表了;个人感觉应该将两个根指针置为NULL比较好)

ListNode* MergeSorted2Lists(ListNode* pHead1, ListNode* pHead2)
{
	if(pHead1 == NULL)
		return pHead2;
	else if(pHead2 == NULL)
		return pHead1;

	
	ListNode* pListNewSmall = pHead1;
	ListNode* pListNewLarge = pHead2;
  

	if(pListNewSmall->m_nValue > pListNewLarge->m_nValue)
	{
		swap(pListNewLarge,pListNewSmall);
	}
	ListNode* pMergedHead = pListNewSmall;

	while(pListNewLarge)
	{
		while( pListNewSmall->m_pNext && pListNewSmall->m_pNext->m_nValue <= pListNewLarge->m_nValue )
		{
			pListNewSmall = pListNewSmall->m_pNext;
		}
		ListNode* tempNode = pListNewSmall->m_pNext;
		pListNewSmall->m_pNext = pListNewLarge;
		pListNewSmall = pListNewLarge;
		pListNewLarge = tempNode;
	}
	return pMergedHead;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值