3-3 设ha和hb分别是两个带表头结点的非递减有序单链表的表头指针,试设计一个算法,将这两个有序链表合并成一个非递增有序的单链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其它的存储空间。表中允许有重复的数据。

思路:以ha为表头,比较a和b链的元素,依次将当前的较小值插入到第一个结点位置,正好可以逆序合并。

ListNode * Merge(ListNode *ha,ListNode *hb){     
ListNode *pa, *pb; //a和b的pointer
ListNode *tmp; //暂存待链入的节点
LIstNode *left; //剩余部分
pa=ha->link; //初始化
pb=hb->link;
ha->link=NULL;
while(pa!=NULL && pb!=NULL){
if(pa->data <= pb->data)
{tmp=pa; pa=pa->link;}
else {tmp=pb;pb=pb->link;}
tmp->link=ha->link; //链入ha
ha->link=tmp;
}
left=(pa != NULL)?pa:pb;
while(left != NULL){ //处理剩下的链
tmp=left;left=left->link;
tmp->link=ha->link;
ha->link=tmp;
}
}

Comments (0)