【数据结构】递增链表合并

LinkList merge_increase(LinkList ListA, LinkList ListB)
{
	LinkList ListC = (LinkList)malloc(sizeof(Node));
	ListC->data = -1;
	ListC->next = NULL;
	LinkList tempC = ListC;
	ListA = ListA->next;
	ListB = ListB->next;
	while (ListA != NULL&&ListB != NULL)
	{
		LinkList temp = 0;
		if (ListA->data <= ListB->data)
		{
			tempC->next = ListA;
			ListA = ListA->next;
		}
		else
		{
			tempC->next = ListB;
			ListB = ListB->next;
		}
		tempC = tempC->next;//到最尾端
	}

	if (ListA != NULL&&ListB==NULL)
	{
		tempC->next = ListA;
	}
	else if (ListA == NULL&&ListB != NULL)
	{
		tempC->next = ListB;
	}

	return ListC;
}


这个是我第一次自己想的代码。思路是再额外申请了一块空间,链表C。然后进行合并算法。在循环中,把较小数据的节点接到链表C的表尾。似乎没有什么问题。但是我们这样做,其实无疑打乱了链表。试想,假如我们把链表A的第一个节点插入C,然后下一次把B插入C,插入操作时间上是把A的节点的next指针指向了B。下一次,也许B的next又要指向A。这样链表完全混乱了。于是我开始参考了天勤的方法。

LinkList merge_increase2(LinkList ListA, LinkList ListB)
{
	LinkList A = ListA->next;
	LinkList B = ListB->next;
	LinkList C = ListA;//拿A的头结点做为表头,将来要返回该链表
	C->next = NULL;//把A的元素部分都断开
	free(ListB);//把B的头节点释放
	LinkList temp = C;//返回的链表为C

	while (A&&B)
	{
		if (A->data <= B->data)
		{
			temp->next = A;
			A = A->next;
		}
		else
		{
			temp->next = B;
			B = B->next;
		}
		temp = temp->next;
	}

	if (A)
	{
		temp->next = A;
	}
	else
	{
		temp->next = B;
	}
	return C;
}
既然插入操作会混乱链表A,B的顺序,使进行合并操作后,A和B都混乱。那干脆把他们都摧毁把。合并完,这两个链表就不用了。我们的方法创建了一个C,把A的头结点的地址交给了C。C的next再指向NULL。这样做。相当于C把A的头结点保存了。再用ListA,LiistB保存了开始节点。并把B的头节点释放掉。接下来就是通过循环进行插入操作,其实这个过程,就相当于把每次把ListA和ListB的开始节点中较小的节点断开并接到C的表尾。最后看哪边还有剩节点,把剩下的那一串再都接到C的表尾。完美。这样的结果,A变成了C,而B被销毁了。没有带来垃圾。太棒了!

猜你喜欢

转载自blog.csdn.net/qq_35564841/article/details/81038562