简单链表合并题

来源:互联网 发布:bcm4360 linux驱动 编辑:程序博客网 时间:2024/06/01 12:26

#include <iostream>#include <cstdlib>#include <ctime>using namespace std;const int A = 4;const int B = 7;struct Node{int data;Node *next;};void createList ( Node *&head, Node *&pNew, int *arr, int n ){int i;head = new Node;pNew = head;for ( i = 0; i < n; i++ ){pNew->next = new Node;pNew = pNew->next;pNew->next = nullptr;pNew->data = arr[i];}}void mergeList ( Node *pNewa, Node *pNewb, Node *prev, Node *headb ){Node *temp1, *temp2;while ( pNewa ){pNewb = headb->next;while ( pNewb ){if ( pNewa->data == pNewb->data ){prev->next = pNewb->next;temp2 = new Node;pNewb = pNewa->next;delete temp2;continue;}else{prev = pNewb;pNewb = pNewb->next;}}temp1 = pNewa;pNewa = pNewa->next;}temp1->next = headb->next;delete headb;}void mergeSort ( Node *&pNewa, Node *&pNewb, Node *heada, Node *headb ){Node *a, *prevb = pNewb;//prevb为当A插入到B时,B的前驱指针,作用为链接要插入的A点while ( pNewa ){a = pNewa;//1.pNewa为循环条件,用一次往后指本身后一个while ( pNewb ){if ( pNewa->data <= pNewb->data ){pNewa = pNewa->next;//2.如果成立即调到下一个,以下次循环条件if ( pNewa == nullptr )//3.当A最后一个点,把A头结点删除delete heada;else heada->next = pNewa->next;//3.让A的头结点指向新的Aa->next = pNewb;//4.插入B点prevb->next = a;//4.插入B点prevb = a;//5.重置prevbreak;}else{prevb = pNewb;pNewb = pNewb->next;}}}}void Show ( Node *p ){while ( p ){cout << p->data << " ";p = p->next;}cout << endl;}int main(){Node *heada, *headb, *pNewa, *pNewb, *prev;int  a[A] = {3, 5, 8, 11}, b[B] = {2, 6, 8, 9, 11, 15, 20};createList ( heada, pNewa, a, A );createList ( headb, pNewb, b, B );pNewa = heada->next;prev = headb;mergeList ( pNewa, pNewb, prev, headb );pNewa = heada->next;Show ( pNewa );createList ( heada, pNewa, a, A );createList ( headb, pNewb, b, B );pNewa = heada->next;pNewb = headb->next;mergeSort (pNewa, pNewb,heada,headb);pNewb = headb->next;Show ( pNewb );return 0;}


原创粉丝点击