|
1鱼币
问题描述:将两个非递减有序单链表合并成一个非递减有序单链表;
输入样例:
5
1 3 5 7 9
6
2 3 4 6 8 10
输出样例:
1 2 3 3 4 5 6 7 8 9 10
以下是我的代码,只有部分是自己写的,剩下是原题目,错误大致在于 Merge(LinkList &A, LinkList &B) 里。
- #include <iostream>
- using namespace std;
- struct Node
- {
- int data;
-
- Node *next;
- };
- class LinkList
- {
- public:
-
- LinkList(int a[],int n);//尾插法在单链表中插入n个数据
-
- ~LinkList();
-
- void PrintList();
-
- Node * GetFirst(){return first;}
- private:
-
- Node *first;
- };
- LinkList::LinkList(int a[],int n)
- {
- first = new Node; //附设头结点
- Node *rear = first;
-
- int i;
- for(i=0;i<n;i++)
- {
- Node *s = new Node;
- s->data = a[i];
- rear->next = s;
- rear = s;
- }
- rear->next = NULL;
- }
- void LinkList::PrintList()
- {
-
- Node *p=first->next;
-
- while(p)
-
- {
-
- cout<<p->data<<" ";
-
- p=p->next;
-
- }
- }
- LinkList::~LinkList()
- {
-
- Node *p=first,*s;
-
- while(!p)
-
- {
-
- s=p;
-
- p=p->next;
-
- delete s;
-
- }
- }
- void Merge(LinkList &A, LinkList &B)
- {
- //Todo:将A和B两个非递减有序单链表合并,结果放到A链表中
-
- Node *p = A.GetFirst() ->next;
- Node *q = B.GetFirst() ->next;
- Node *s, *t;
- s = q;
- t = p;
-
- //while里的m 和n 是主函数的变量,不知道怎么访问,或者有别的方法?求指教=_=
- while(q->next!= nullptr)
- {
- for(int count = 0; count<m; count++)
- {
- if(s->data >= p->data && s->next < p->next)
- {
- q = q->next ;
- s->next =p->next ;
- p->next =s;
- s = q;
- }
- else
- {
- p = p->next;
- }
- }
-
- }
- }
- int main()
- {
- int m,i,x;
-
- cin >> m;
- int a[m];
- for(i=0;i<m;i++)
- {
- cin >> a[i];
- }
- LinkList la(a,m);
- //Todo:用与la相同方式创建单链表lb
- cin >> n;
- int b[n];
- for(i=0;i<n;i++)
- {
- cin >> b[i];
- }
- LinkList lb(b,n);
-
-
- Merge(la,lb);
- la.PrintList();
- return 0;
- }
复制代码
本帖最后由 xieglt 于 2020-9-23 17:29 编辑
- #include <iostream>
- using namespace std;
- struct Node
- {
- int data;
- struct Node *next;
-
- bool operator > (const struct Node & e)
- {
- return (data > e.data) ? true : false;
- }
- bool operator < (const struct Node & e)
- {
- return (data < e.data) ? true : false;
- }
- };
- class LinkList
- {
- public:
-
- LinkList(int a[],int n);//尾插法在单链表中插入n个数据
-
- ~LinkList();
-
- void PrintList();
-
- Node * GetFirst(){return first->next;}
-
- void Clean()
- {
- first->next = NULL;
- }
- void SetList(Node * p)
- {
- first->next = p;
- }
- private:
-
- Node *first;
- };
- LinkList::LinkList(int a[],int n)
- {
- first = new Node; //附设头结点
- Node *rear = first;
-
- int i;
- for(i=0;i<n;i++)
- {
- Node *s = new Node;
- s->data = a[i];
- rear->next = s;
- rear = s;
- }
- rear->next = NULL;
- }
- void LinkList::PrintList()
- {
-
- Node *p=first->next;
-
- while(p)
-
- {
-
- cout<<p->data<<" ";
-
- p=p->next;
-
- }
- }
- LinkList::~LinkList()
- {
-
- Node *p=first,*s;
-
- //!p 循环条件逻辑错误,
- while(p != NULL)
-
- {
-
- s=p;
-
- p=p->next;
-
- delete s;
-
- }
- }
- Node * MergeList(Node* l1,Node * l2)
- {
- if(l1 == NULL)
- {
- return l2;
- }
-
- if(l2 == NULL)
- {
- return l1;
- }
-
- Node * lpHead = (* l1 < * l2) ? l1 : l2;
- Node * lpBig = (* l1 < * l2) ? l2 : l1;
-
- Node * lpSmall = lpHead;
-
- while(lpSmall != NULL)
- {
- if(lpSmall->next == NULL)
- {
- lpSmall->next = lpBig;
- break;
- }
-
- if(*(lpSmall->next) < * lpBig)
- {
- lpSmall = lpSmall->next;
- }
- else
- {
- Node * lpNode = lpSmall->next;
- lpSmall->next = lpBig;
-
- lpSmall = lpBig;
- lpBig = lpNode;
- }
- }
- return lpHead;
- }
- void Merge(LinkList &A, LinkList &B)
- {
-
- Node *p = A.GetFirst();
- Node *q = B.GetFirst();
- Node *s, *t;
- s = q;
- t = p;
- A.SetList(MergeList(p,q));
- //将两个链表合并后,要把后一个链表清空,否则释放内存释放两次
- B.Clean();
-
- //while里的m 和n 是主函数的变量,不知道怎么访问,或者有别的方法?求指教=_=
- /* while(q->next!= nullptr)
- {
- for(int count = 0; count<m; count++)
- {
- if(s->data >= p->data && s->next < p->next)
- {
- q = q->next ;
- s->next =p->next ;
- p->next =s;
- s = q;
- }
- else
- {
- p = p->next;
- }
- }
-
- }
- */
- }
- int main()
- {
- int m,n,i,x;
-
- cin >> m;
- //动态数组不能这么定义,得用new生成
- //int a[m]
- int * a = new int[m];
- for(i=0;i<m;i++)
- {
- cin >> a[i];
- }
- LinkList la(a,m);
- delete[] a;
- //Todo:用与la相同方式创建单链表lb
- cin >> n;
- int * b = new int[n];
- for(i=0;i<n;i++)
- {
- cin >> b[i];
- }
- LinkList lb(b,n);
- delete [] b;
-
-
- Merge(la,lb);
- la.PrintList();
- return 0;
- }
复制代码
|
|