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被销毁了。没有带来垃圾。太棒了!