数据结构中关于链表的一个简单问题
学数据结构还是上个学期的事,什么?觉得怎么样?唉,别提了,那个时候被我们那位女老师给搞晕了,上课的时候只有一个声调,照着书本上的算法在黑板解释给我们听都还不能流畅,你就可想而知我们觉得怎么样了。当然啦,这些都是客观原因,自己不认真是实质所在。一直很想再好好看看,现在又有机会听一位科大博士的数据结构课程,自然是倍感珍惜,只希望可以跟着他,把以前的知识再过一遍,我想会有新的收获。
下面就把今天这个问题讲一下吧,也许在老鸟看来是一个小儿科的问题,但是没有办法,我不是什么聪明的人,只好用笨办法,现在一边回忆一边总结。就算我记性不好,时不时的拿来看看,一来可以巩固一下知识,二来,也许会发现以前的不足。
问题1:合并两个递增的线性链表为一个递增的线性链表。
这个问题是我们的数据结构课程里,是一个常见的问题。但是以住我们会不太注意时间和空间复杂度的问题,这个学期我又选了算法这门课,一边惊叹同一个问题用不同的方法可能会带来效率的极大差别,一边也告诉自己,以后做程序不能以解决问题做为评判成绩唯一标准。而要追求,出色的完成任务。所以,这是我从这个问题考虑到的。
解决:基于比较,分别比较两个链表的元素,选出较小的加到新的链表中。
算法:
void MargeList( LinkList &La, LinkList &Lb, LinkList &Lc)
{
Pa=La->next;Pb=Lb->next;//初始化链表
Lc=Pc=La;//共用La的结点空间
while( pa&&pb ){
if( pa->data <= pb->data ){
pc->next=pa; //链到Lc头结点后
pc = pa; //pc指针移到Lc的最后一个结点
pa=pa->next; //pa指向下一个结点
}
else
{
pc->next=pb;
pc = pb;
pb = pb->next;
}
pc->next==pa?pa:pb; //剩下的结点直接插入
free(Lb);
}
(未完,我去吃饭了)
{
Pa=La->next;Pb=Lb->next;//初始化链表
Lc=Pc=La;//共用La的结点空间
while( pa&&pb ){
if( pa->data <= pb->data ){
pc->next=pa; //链到Lc头结点后
pc = pa; //pc指针移到Lc的最后一个结点
pa=pa->next; //pa指向下一个结点
}
else
{
pc->next=pb;
pc = pb;
pb = pb->next;
}
pc->next==pa?pa:pb; //剩下的结点直接插入
free(Lb);
}