鱼C论坛

 找回密码
 立即注册
查看: 1555|回复: 5

[已解决]C++合并有序链表

[复制链接]
发表于 2020-9-23 16:25:58 | 显示全部楼层 |阅读模式
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) 里。
  1. #include <iostream>
  2. using namespace std;
  3. struct Node
  4. {
  5.         int data;
  6.    
  7.         Node *next;
  8. };
  9. class LinkList
  10. {
  11. public:
  12.    
  13.         LinkList(int a[],int n);//尾插法在单链表中插入n个数据
  14.         
  15.         ~LinkList();
  16.         
  17.         void PrintList();
  18.            
  19.         Node * GetFirst(){return first;}

  20. private:
  21.    
  22.         Node *first;
  23. };

  24. LinkList::LinkList(int a[],int n)
  25. {
  26.         first = new Node; //附设头结点

  27.         Node *rear = first;
  28.         
  29.         int i;
  30.         for(i=0;i<n;i++)
  31.         {
  32.                 Node *s = new Node;
  33.                 s->data = a[i];
  34.                 rear->next = s;
  35.                 rear = s;
  36.         }        
  37.         rear->next = NULL;
  38. }

  39. void LinkList::PrintList()
  40. {
  41.         
  42.         Node *p=first->next;
  43.         
  44.         while(p)
  45.                
  46.         {
  47.                
  48.                 cout<<p->data<<" ";
  49.         
  50.                 p=p->next;
  51.                
  52.         }
  53. }


  54. LinkList::~LinkList()
  55. {
  56.    
  57.         Node *p=first,*s;
  58.    
  59.         while(!p)
  60.                
  61.         {
  62.         
  63.                 s=p;
  64.         
  65.                 p=p->next;
  66.         
  67.                 delete s;
  68.                
  69.         }
  70. }

  71. void Merge(LinkList &A, LinkList &B)
  72. {
  73.         //Todo:将A和B两个非递减有序单链表合并,结果放到A链表中
  74.         
  75.         Node *p = A.GetFirst() ->next;
  76.         Node *q = B.GetFirst() ->next;
  77.         Node *s, *t;
  78.         s = q;
  79.         t = p;
  80.         
  81. //while里的m 和n 是主函数的变量,不知道怎么访问,或者有别的方法?求指教=_=      
  82.         while(q->next!= nullptr)
  83.         {
  84.                 for(int count = 0; count<m; count++)
  85.                 {
  86.                         if(s->data >= p->data && s->next < p->next)
  87.                         {
  88.                                 q = q->next ;
  89.                                 s->next =p->next ;
  90.                                 p->next =s;
  91.                                 s = q;
  92.                         }
  93.                         else
  94.                         {
  95.                                 p = p->next;
  96.                         }
  97.                 }
  98.                
  99.         }

  100. }
  101. int main()
  102. {
  103.         int m,i,x;
  104.    
  105.         cin >> m;
  106.         int a[m];
  107.         for(i=0;i<m;i++)
  108.         {
  109.                 cin >> a[i];
  110.           }
  111.         LinkList la(a,m);

  112.         //Todo:用与la相同方式创建单链表lb
  113.         cin >> n;
  114.         int b[n];
  115.         for(i=0;i<n;i++)
  116.         {
  117.                 cin >> b[i];
  118.           }
  119.         LinkList lb(b,n);

  120.         
  121.             
  122.         Merge(la,lb);

  123.         la.PrintList();

  124.         return 0;
  125. }
复制代码

最佳答案
2020-9-23 16:25:59
本帖最后由 xieglt 于 2020-9-23 17:29 编辑
  1. #include <iostream>
  2. using namespace std;

  3. struct Node
  4. {
  5.         int data;
  6.         struct Node *next;
  7.                
  8.                 bool operator > (const struct Node  & e)
  9.                 {
  10.                         return (data > e.data) ? true : false;
  11.                 }

  12.                 bool operator < (const struct Node  & e)
  13.                 {
  14.                         return (data < e.data) ? true : false;
  15.                 }
  16. };

  17. class LinkList
  18. {
  19. public:
  20.    
  21.         LinkList(int a[],int n);//尾插法在单链表中插入n个数据
  22.         
  23.         ~LinkList();
  24.         
  25.         void PrintList();
  26.            
  27.         Node * GetFirst(){return first->next;}
  28.                
  29.                 void Clean()
  30.                 {
  31.                         first->next = NULL;
  32.                 }

  33.                 void SetList(Node * p)
  34.                 {
  35.                         first->next = p;
  36.                 }

  37. private:
  38.    
  39.         Node *first;
  40. };

  41. LinkList::LinkList(int a[],int n)
  42. {
  43.         first = new Node; //附设头结点

  44.         Node *rear = first;
  45.         
  46.         int i;
  47.         for(i=0;i<n;i++)
  48.         {
  49.                 Node *s = new Node;
  50.                 s->data = a[i];
  51.                 rear->next = s;
  52.                 rear = s;
  53.         }        
  54.         rear->next = NULL;
  55. }

  56. void LinkList::PrintList()
  57. {
  58.         
  59.         Node *p=first->next;
  60.         
  61.         while(p)
  62.                
  63.         {
  64.                
  65.                 cout<<p->data<<" ";
  66.         
  67.                 p=p->next;
  68.                
  69.         }
  70. }


  71. LinkList::~LinkList()
  72. {
  73.    
  74.         Node *p=first,*s;
  75.                
  76.                 //!p 循环条件逻辑错误,
  77.         while(p != NULL)
  78.                
  79.         {
  80.         
  81.                 s=p;
  82.         
  83.                 p=p->next;
  84.         
  85.                 delete s;
  86.                
  87.         }
  88. }

  89. Node * MergeList(Node* l1,Node * l2)
  90. {
  91.         if(l1 == NULL)
  92.         {
  93.                 return l2;
  94.         }
  95.        
  96.         if(l2 == NULL)
  97.         {
  98.                 return l1;
  99.         }
  100.        
  101.         Node * lpHead = (* l1 < * l2) ? l1 : l2;
  102.         Node * lpBig = (* l1 < * l2) ? l2 : l1;
  103.        
  104.         Node * lpSmall = lpHead;
  105.        
  106.         while(lpSmall != NULL)
  107.         {
  108.                 if(lpSmall->next == NULL)
  109.                 {
  110.                         lpSmall->next = lpBig;
  111.                         break;
  112.                 }
  113.                
  114.                 if(*(lpSmall->next) < * lpBig)
  115.                 {
  116.                         lpSmall = lpSmall->next;
  117.                 }
  118.                 else
  119.                 {
  120.                         Node * lpNode = lpSmall->next;
  121.                         lpSmall->next = lpBig;
  122.                        
  123.                         lpSmall = lpBig;
  124.                         lpBig = lpNode;
  125.                 }
  126.         }       
  127.         return lpHead;
  128. }

  129. void Merge(LinkList &A, LinkList &B)
  130. {
  131.        
  132.         Node *p = A.GetFirst();
  133.         Node *q = B.GetFirst();
  134.         Node *s, *t;
  135.         s = q;
  136.         t = p;

  137.         A.SetList(MergeList(p,q));
  138.         //将两个链表合并后,要把后一个链表清空,否则释放内存释放两次
  139.         B.Clean();
  140.        
  141.         //while里的m 和n 是主函数的变量,不知道怎么访问,或者有别的方法?求指教=_=      
  142. /*        while(q->next!= nullptr)
  143.         {
  144.                 for(int count = 0; count<m; count++)
  145.                 {
  146.                         if(s->data >= p->data && s->next < p->next)
  147.                         {
  148.                                 q = q->next ;
  149.                                 s->next =p->next ;
  150.                                 p->next =s;
  151.                                 s = q;
  152.                         }
  153.                         else
  154.                         {
  155.                                 p = p->next;
  156.                         }
  157.                 }
  158.                
  159.     }
  160. */
  161. }

  162. int main()
  163. {
  164.         int m,n,i,x;
  165.    
  166.         cin >> m;
  167.                 //动态数组不能这么定义,得用new生成
  168.                 //int a[m]
  169.         int * a = new int[m];
  170.         for(i=0;i<m;i++)
  171.         {
  172.                 cin >> a[i];
  173.         }
  174.         LinkList la(a,m);
  175.                 delete[] a;

  176.         //Todo:用与la相同方式创建单链表lb
  177.         cin >> n;
  178.         int * b = new int[n];
  179.         for(i=0;i<n;i++)
  180.         {
  181.                 cin >> b[i];
  182.           }
  183.         LinkList lb(b,n);
  184.                 delete [] b;

  185.         
  186.             
  187.         Merge(la,lb);

  188.         la.PrintList();

  189.         return 0;
  190. }
复制代码

最佳答案

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-23 16:25:59 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-9-23 17:29 编辑
  1. #include <iostream>
  2. using namespace std;

  3. struct Node
  4. {
  5.         int data;
  6.         struct Node *next;
  7.                
  8.                 bool operator > (const struct Node  & e)
  9.                 {
  10.                         return (data > e.data) ? true : false;
  11.                 }

  12.                 bool operator < (const struct Node  & e)
  13.                 {
  14.                         return (data < e.data) ? true : false;
  15.                 }
  16. };

  17. class LinkList
  18. {
  19. public:
  20.    
  21.         LinkList(int a[],int n);//尾插法在单链表中插入n个数据
  22.         
  23.         ~LinkList();
  24.         
  25.         void PrintList();
  26.            
  27.         Node * GetFirst(){return first->next;}
  28.                
  29.                 void Clean()
  30.                 {
  31.                         first->next = NULL;
  32.                 }

  33.                 void SetList(Node * p)
  34.                 {
  35.                         first->next = p;
  36.                 }

  37. private:
  38.    
  39.         Node *first;
  40. };

  41. LinkList::LinkList(int a[],int n)
  42. {
  43.         first = new Node; //附设头结点

  44.         Node *rear = first;
  45.         
  46.         int i;
  47.         for(i=0;i<n;i++)
  48.         {
  49.                 Node *s = new Node;
  50.                 s->data = a[i];
  51.                 rear->next = s;
  52.                 rear = s;
  53.         }        
  54.         rear->next = NULL;
  55. }

  56. void LinkList::PrintList()
  57. {
  58.         
  59.         Node *p=first->next;
  60.         
  61.         while(p)
  62.                
  63.         {
  64.                
  65.                 cout<<p->data<<" ";
  66.         
  67.                 p=p->next;
  68.                
  69.         }
  70. }


  71. LinkList::~LinkList()
  72. {
  73.    
  74.         Node *p=first,*s;
  75.                
  76.                 //!p 循环条件逻辑错误,
  77.         while(p != NULL)
  78.                
  79.         {
  80.         
  81.                 s=p;
  82.         
  83.                 p=p->next;
  84.         
  85.                 delete s;
  86.                
  87.         }
  88. }

  89. Node * MergeList(Node* l1,Node * l2)
  90. {
  91.         if(l1 == NULL)
  92.         {
  93.                 return l2;
  94.         }
  95.        
  96.         if(l2 == NULL)
  97.         {
  98.                 return l1;
  99.         }
  100.        
  101.         Node * lpHead = (* l1 < * l2) ? l1 : l2;
  102.         Node * lpBig = (* l1 < * l2) ? l2 : l1;
  103.        
  104.         Node * lpSmall = lpHead;
  105.        
  106.         while(lpSmall != NULL)
  107.         {
  108.                 if(lpSmall->next == NULL)
  109.                 {
  110.                         lpSmall->next = lpBig;
  111.                         break;
  112.                 }
  113.                
  114.                 if(*(lpSmall->next) < * lpBig)
  115.                 {
  116.                         lpSmall = lpSmall->next;
  117.                 }
  118.                 else
  119.                 {
  120.                         Node * lpNode = lpSmall->next;
  121.                         lpSmall->next = lpBig;
  122.                        
  123.                         lpSmall = lpBig;
  124.                         lpBig = lpNode;
  125.                 }
  126.         }       
  127.         return lpHead;
  128. }

  129. void Merge(LinkList &A, LinkList &B)
  130. {
  131.        
  132.         Node *p = A.GetFirst();
  133.         Node *q = B.GetFirst();
  134.         Node *s, *t;
  135.         s = q;
  136.         t = p;

  137.         A.SetList(MergeList(p,q));
  138.         //将两个链表合并后,要把后一个链表清空,否则释放内存释放两次
  139.         B.Clean();
  140.        
  141.         //while里的m 和n 是主函数的变量,不知道怎么访问,或者有别的方法?求指教=_=      
  142. /*        while(q->next!= nullptr)
  143.         {
  144.                 for(int count = 0; count<m; count++)
  145.                 {
  146.                         if(s->data >= p->data && s->next < p->next)
  147.                         {
  148.                                 q = q->next ;
  149.                                 s->next =p->next ;
  150.                                 p->next =s;
  151.                                 s = q;
  152.                         }
  153.                         else
  154.                         {
  155.                                 p = p->next;
  156.                         }
  157.                 }
  158.                
  159.     }
  160. */
  161. }

  162. int main()
  163. {
  164.         int m,n,i,x;
  165.    
  166.         cin >> m;
  167.                 //动态数组不能这么定义,得用new生成
  168.                 //int a[m]
  169.         int * a = new int[m];
  170.         for(i=0;i<m;i++)
  171.         {
  172.                 cin >> a[i];
  173.         }
  174.         LinkList la(a,m);
  175.                 delete[] a;

  176.         //Todo:用与la相同方式创建单链表lb
  177.         cin >> n;
  178.         int * b = new int[n];
  179.         for(i=0;i<n;i++)
  180.         {
  181.                 cin >> b[i];
  182.           }
  183.         LinkList lb(b,n);
  184.                 delete [] b;

  185.         
  186.             
  187.         Merge(la,lb);

  188.         la.PrintList();

  189.         return 0;
  190. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-23 18:28:27 | 显示全部楼层

能不能只改while里的代码,别的代码题目给的尽量不动
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-23 21:30:36 | 显示全部楼层
你这s 和 t 有什么定义的必要么  而且还把s 和 p混用
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-24 14:22:01 | 显示全部楼层
  1. #include <iostream>
  2. using namespace std;
  3. struct Node
  4. {
  5.         int data;
  6.    
  7.         Node *next;
  8. };
  9. class LinkList
  10. {
  11. public:
  12.    
  13.         LinkList(int a[],int n);//尾插法在单链表中插入n个数据
  14.         
  15.         ~LinkList();
  16.         
  17.         void PrintList();
  18.            
  19.         Node * GetFirst(){return first;}

  20. private:
  21.    
  22.         Node *first;
  23. };

  24. LinkList::LinkList(int a[],int n)
  25. {
  26.         first = new Node; //附设头结点

  27.         Node *rear = first;
  28.         
  29.         int i;
  30.         for(i=0;i<n;i++)
  31.         {
  32.                 Node *s = new Node;
  33.                 s->data = a[i];
  34.                 rear->next = s;
  35.                 rear = s;
  36.         }        
  37.         rear->next = nullptr;
  38. }

  39. void LinkList::PrintList()
  40. {
  41.         
  42.         Node *p=first->next;
  43.         
  44.         while(p)
  45.                
  46.         {
  47.                
  48.                 cout<<p->data<<" ";
  49.         
  50.                 p=p->next;
  51.                
  52.         }
  53. }


  54. LinkList::~LinkList()
  55. {
  56.    
  57.         Node *p=first,*s;
  58.    
  59.         while(p)
  60.                
  61.         {
  62.         
  63.                 s=p;
  64.         
  65.                 p=p->next;
  66.         
  67.                 delete s;
  68.                
  69.         }
  70. }

  71. void Merge(LinkList &A, LinkList &B, int m,int n)
  72. {
  73.         //Todo:将A和B两个非递减有序单链表合并,结果放到A链表中
  74.         
  75.         Node *p = A.GetFirst() ->next;
  76.         Node *q = B.GetFirst() ->next;
  77.         Node *s, *t, *j;
  78.         t = A.GetFirst()->next;
  79.         s = B.GetFirst()->next;
  80.         
  81. //while里的m 和n 是主函数的变量,不知道怎么访问,或者有别的方法?求指教=_=      
  82.         while(p)
  83.         {
  84.                 if(p->data<q->data&&p)
  85.                 {
  86.                     t = p;
  87.                     p = p->next;
  88.                 }
  89.                 else
  90.                 {
  91.                     t->next = s;
  92.                     while((q->data<=p->data)&&q)
  93.                     {
  94.                         s = q;
  95.                         q = q->next;
  96.                     }
  97.                     s->next = p;
  98.                     s = q;
  99.                 }
  100.         }
  101.         if(q)
  102.         {
  103.             t->next = q;
  104.         }

  105. }
  106. int main()
  107. {
  108.         int m,n,i,x;
  109.    
  110.         cin >> m;
  111.         int a[m];
  112.         for(i=0;i<m;i++)
  113.         {
  114.             cin >> a[i];
  115.         }
  116.         LinkList la(a,m);

  117.         //Todo:用与la相同方式创建单链表lb
  118.         cin >> n;
  119.         int b[n];
  120.         for(i=0;i<n;i++)
  121.         {
  122.             cin >> b[i];
  123.         }
  124.         LinkList lb(b,n);

  125.         cout<< "Merge"<<endl;
  126.             
  127.         Merge(la,lb,m,n);

  128.         la.PrintList();

  129.         return 0;
  130. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-25 11:06:25 | 显示全部楼层
  1. #pragma once
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>

  5. typedef struct Node
  6. {
  7.         Node* pNext;
  8.         int data;
  9. }Node, *pNode;

  10. typedef struct Link
  11. {
  12.         int cur_len;
  13.         pNode pHeader;
  14. }Link, *PLink;


  15. PLink InitLink()
  16. {
  17.         pNode pHeader = (pNode)malloc(sizeof(Node));
  18.         memset(pHeader, 0, sizeof(Node));
  19.         pHeader->data = 0;
  20.         pHeader->pNext = NULL;

  21.         PLink plinkNode = (PLink)malloc(sizeof(Link));
  22.         memset(plinkNode, 0, sizeof(Link));
  23.         plinkNode->cur_len = 0;
  24.         plinkNode->pHeader = pHeader;

  25.         return plinkNode;
  26. }

  27. bool AddNode(PLink plinkNode, int data)
  28. {
  29.         pNode pHeader = plinkNode->pHeader;
  30.         if (pHeader == NULL)
  31.         {
  32.                 printf("无效链表\n");
  33.                 return false;
  34.         }
  35.         pNode pTempNode = (pNode)malloc(sizeof(Node));
  36.         memset(pTempNode, 0, sizeof(Node));
  37.         pTempNode->data = data;
  38.         pTempNode->pNext = NULL;

  39.         pNode pCurNode = pHeader;
  40.         while (pCurNode->pNext != NULL)
  41.         {
  42.                 pCurNode = pCurNode->pNext;
  43.         }
  44.         pCurNode->pNext = pTempNode;
  45.         plinkNode->cur_len++;
  46.         return true;
  47. }

  48. bool InsertSortData(PLink plinkNode, int data)
  49. {
  50.         pNode pHeader = plinkNode->pHeader;
  51.         if (pHeader == NULL)
  52.         {
  53.                 printf("无效链表\n");
  54.                 return -1;
  55.         }

  56.         pNode pCurNode = pHeader;
  57.         int flag = 0;
  58.         while (pCurNode->pNext != NULL)
  59.         {
  60.                 if (pCurNode->pNext->data >= data)
  61.                 {
  62.                         pNode pTempNode = (pNode)malloc(sizeof(Node));
  63.                         pTempNode->data = data;
  64.                         pTempNode->pNext = pCurNode->pNext;
  65.                         pCurNode->pNext = pTempNode;
  66.                         flag = 1;
  67.                         plinkNode->cur_len++;
  68.                         break;
  69.                 }
  70.                 else
  71.                 {
  72.                         pCurNode = pCurNode->pNext;
  73.                 }
  74.         }
  75.         // 最后一个
  76.         if (flag == 0)
  77.         {
  78.                 pNode pTempNode = (pNode)malloc(sizeof(Node));
  79.                 pTempNode->data = data;
  80.                 pTempNode->pNext = pCurNode->pNext;
  81.                 pCurNode->pNext = pTempNode;
  82.                 plinkNode->cur_len++;
  83.         }
  84. }

  85. void MergeLink(PLink plinkNode1, PLink plinkNode2)
  86. {
  87.         // 将 Plink2 中的元素,插入 Plink1中

  88.         pNode pHeader1 = plinkNode1->pHeader;
  89.         pNode pHeader2 = plinkNode2->pHeader;


  90.         pNode pCurNode1 = pHeader1->pNext;
  91.         pNode pCurNode2 = pHeader2->pNext;


  92.         /*
  93.         5
  94.         1 3 5 7 9
  95.         6
  96.         2 3 4 6 8 10
  97.         */
  98.         for (int i = 0; i < plinkNode2->cur_len; i++)
  99.         {
  100.                 InsertSortData(plinkNode1, pCurNode2->data);
  101.                 pHeader2->pNext = pCurNode2->pNext;
  102.                 free(pCurNode2);
  103.                 pCurNode2 = pHeader2->pNext;
  104.         }
  105.         free(pHeader2);
  106.         free(plinkNode2);

  107. }

  108. int main()
  109. {
  110.         PLink plinkNode1 = InitLink();
  111.         PLink plinkNode2 = InitLink();
  112.         for (int i = 1; i < 10; i+=2)
  113.         {
  114.                 AddNode(plinkNode1, i);
  115.         }
  116.         for (int i = 2; i < 11; i+=2)
  117.         {
  118.                 AddNode(plinkNode2, i);
  119.         }

  120.         MergeLink(plinkNode1, plinkNode2);


  121.         system("pause");
  122.         return 0;       
  123. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 09:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表