两个有序单链表合并

/*合并两个有序链表*/
/*思想:可以这样想,是将两个链表list1, list2合成一个第三个链表merge_list的过程。
1. 先从两个链表的头中选择小的节点,初始化作为合成链表merge_list的头,
2. 然后从两个链表头开始,选择两个链表头节点小的那一个,开始找,找到全部小于另外一个链表头的所有节点,
3. 将这部分加到merge_list,然后这个链表的头更新,
继续开始重复2, 直到有一个链表到达结尾null*/
single_list_node* Merge_two_ordered_list(single_list_node* list1, single_list_node* list2)
{
	single_list_node *last1 = NULL, *p1 = NULL, *last2 = NULL, *p2 = NULL;
	single_list_node *tmp1 = NULL, *tmp2 = NULL;
	single_list_node* head = NULL;
	
	if(NULL == list1)
	{
		return list2;
	}
	if(NULL == list2)
	{
		return list1;
	}
	
	p1 = list1;
	p2 = list2;
	
	/*两个链表都是从小到大的,因此两个头中小的那一个是合并后链表的头节点*/
	if(p1->data <= p2->data)
	{
		head = p1;
	}
	else
	{
		head = p2;
	}
	

	/*两个指针p1 p2分别指向两个链表中本次在比较的数字,
	  举例子,假设p1->data <= p2->data情况:
	  选取小的那个节点所在的链表p1,从p1开始向后找,在list1中找到大于p2节点的前一个节点last1,
	  则p1到last1之间的数字都是小于p2节点的,将last1->next指向p2,即将list1中小于p2节点的节点从list1中插入到p2前面了。
	   此时p1更新为last1的下一个节点,开始新一次的处理*/
	while(p1 != NULL && p2 != NULL)
	{
		if(p1->data <= p2->data)
		{
			tmp1 = p1;
			while(tmp1 != NULL && tmp1->data <= p2->data)
			{
				last1 = tmp1;
				tmp1 = tmp1->next;
			}
			last1->next = p2;
			p1 = tmp1;
			last1 = NULL;
		}
		else
		{
			tmp2 = p2;
			while(tmp2 != NULL && tmp2->data <= p1->data)
			{
				last2 = tmp2;
				tmp2 = tmp2->next;
			}
			last2->next = p1;
			p2 = tmp2;
			last2 = NULL;
		}
	}
	return head;
	
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值