/*合并两个有序链表*/
/*思想:可以这样想,是将两个链表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;
}