算法思想:
方法一:非递归
建立 一个新表LC,利用尾插法建立单链表的方法,从头结开始比较LA、LB中的数据,将LA、LB中较小的数插入到LC 中。
1、设pa、pb分别指向LA、LB的头结点,比较两个数据,将元素较小的节点插入LC中,然后将元素较小的指针指向下一节点,另
一指针不动。直到有一指针指向空节点。
2、将另一未指向空节点的指针的剩余节点全都链到 LC中。
3、返回单链表LC。
PLinkNode MergeList(PLinkNode& LA,PLinkNode& LB) { LinkNode *pa = LA; LinkNode *pb = LB; LinkNode *LC = NULL; LinkNode *pc; //找出两个链表中第一个结点较小的结点,LC记录较小结点的头结点 if(pa->_data <= pb->_data) { LC = pa; pa = pa->_next; } else { LC = pb; pb = pb->_next; } pc=LC; //在两个链表中遍历比较,将值较小的结点链接到pc结点后 while (pa != NULL && pb != NULL) { if(pa->_data <= pb->_data ) { pc->_next = pa; pc = pa; pa = pa->_next; } else { pc->_next = pb; pc = pb; pb = pb->_next; } } //将pa或pb剩余的结点链到pc之后,完成整个合并的过程 if(pa) pc->_next = pa; else pc->_next = pb; return LC; /*LinkNode *LC=NULL; LinkNode *pa = LA; LinkNode *pb = LB; LinkNode *pc = LC; while(pa != NULL && pb != NULL) { //尾插法 if(pa->_data <= pb->_data) { PushBack(LC,pa->_data); pa = pa->_next; } else { PushBack(LC,pb->_data); pb = pb->_next; } } while(pa !=NULL) { PushBack(LC,pa->_data); pa=pa->_next; } while(pb != NULL) { PushBack(LC,pb->_data); pb = pb->_next; } return LC;*/ }
方法二: 递归
PLinkNode MergeRecursive(PLinkNode& head1 , PLinkNode& head2) { PLinkNode head = NULL ; if ( head1 == NULL ) return head2 ; if ( head2 == NULL) return head1 ; if ( head1->_data <= head2->_data ) { head = head1 ; head->_next = MergeRecursive(head1->_next,head2); } else { head = head2 ; head->_next = MergeRecursive(head1,head2->_next); } return head ; }