【面试题】剑指Offer-17-合并两个有序的单链表

题目概述


解题思路

定义两个指针pCur1,pCur2分别遍历两个链表

定义pPrev1,pPrev2指向pCur1,pCu2的前一个节点

根据pCur1,pCur2指向数据的大小进行判断

利用pPrev1,pPrev2改变指向

注意

1、需要定义pNewHead先判断两个链表头部节点的大小

并保存小的节点

2、在遍历改变指向的时候,注意指针是否为空

3、出循环后,必须要判断一下,因为一定是一个链表遍历完了,一个没有遍历完

并将没有遍历完的链接上去

代码实现

非递归

Node* MergeOrderListNonR(Node* phead1, Node* phead2)
{
	if (phead1 == NULL)
		return phead2;
	if (phead2 == NULL)
		return phead1;

	Node* newHead = NULL;
	if (phead1->_data < phead2->_data)
		newHead = phead1;
	else
		newHead = phead2;

	Node* cur1 = phead1;
	Node* cur2 = phead2;
	Node* prev1 = NULL;
	Node* prev2 = NULL;

	while (cur1 && cur2)
	{
		while (cur1 && cur1->_data < cur2->_data)
		{
			prev1 = cur1;
			cur1 = cur1->_next;
		}
		
		//判断头指向了1还是2
		if (prev1)
			prev1->_next = cur2;

		//如果cur1为空,下面会崩溃
		if (cur1 == NULL)
			break;

		while (cur2 && cur2->_data < cur1->_data)
		{
			prev2 = cur2;
			cur2 = cur2->_next;
		}

		prev2->_next = cur1;
	}

	if (cur1 == NULL)
		prev1->_next = cur2;
	else
		prev2->_next = cur1;

	return newHead;
}

递归实现

Node* MergeOrderList(Node* phead1, Node* phead2)
{
	if (phead1 == NULL)
		return phead2;
	if (phead2 == NULL)
		return phead1;

	Node* newHead = NULL;

	if (phead1->_data < phead2->_data)
	{
		newHead = phead1;
		newHead->_next = MergeOrderList(phead1->_next, phead2);
	}
	else
	{
		newHead = phead2;
		newHead->_next = MergeOrderList(phead1, phead2->_next);
	}

	return newHead;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值