zoukankan      html  css  js  c++  java
  • 基础数据结构-线性表-单链表的合并操作

    本篇与顺序表的合并题目相同,只不过用了链表的方式实现

    #include <iostream>
    using namespace std;
    #define ok 0
    #define error -1
    
    class ListNode
    {public:
        int data;
        ListNode * next;
        ListNode() {next = NULL;}
     };        //链表结点类定义
     
     class LinkList
     {public:
         ListNode *head;
         int len;
         LinkList();
         //~LinkList();
         ListNode * LL_index(int i);        //返回第i个结点的指针,如果不存在返回NULL 
         int LL_get(int i);        //获取第i个元素的数据 
         int LL_insert(int i,int item);        //把数值item插入第i个位置 
         int LL_del(int i);        //删除第i个节点 
         void LL_display();        //输出单链表的内容 
        int LL_merge(ListNode *La, ListNode *Lb);        //合并链表
      };        //带头节点的单链表类定义
      
      LinkList::LinkList()
      {
          head = new ListNode();
          len = 0;
      }
      
    /*  LinkList::~LinkList()
      {
          ListNode *p,*q;
          p = head;
          while(p != NULL){
              q = p;
              p = p->next;
              delete q;
          }
      }*/
    
      ListNode * LinkList::LL_index(int i)
      {      
        ListNode *p;
          int j = 0;
          p = head;
          while(p!=NULL && j<i){
              p = p->next;
            j++;
        }
        if(!p)  return NULL;
        return p;
      }
      
      int LinkList::LL_get(int i)
      {
          if(i<1||i>len) return error;
        else{
        ListNode *LL;
        LL =  LL_index(i);
        cout << LL->data << endl;
        return ok;
        }
      }
      
      int LinkList::LL_insert(int i,int item)
      {
          if(i>len+1) return error;
        else{
              ListNode *p,*s;
              p = LL_index(i-1);
              s = new ListNode();
              s->next = p->next;
              p->next = s;
              s->data = item;
            len++;
            return ok;
        }
      }
      
      int LinkList::LL_del(int i)
      {
          if(i<1||i>len) return error;
        else{
              ListNode *p;
            p = LL_index(i-1);
            p->next = p->next->next;
              len--;
            return ok;
            }
      }
        
      void LinkList::LL_display()
      {
          ListNode *p;
          p = head->next;
          while(p){
              cout << p->data << ' ';
              p = p->next;
          }
          cout<<endl;
      }
    
    int LinkList::LL_merge(ListNode *La, ListNode *Lb)
      {
        ListNode *pa, *pb, *pc, *Lc,*p;
        pa = La->next;    pb = Lb->next;
        Lc = pc = La;             // 用La的头结点作为Lc的头结点
        while (pa && pb) {
          if (pa->data <= pb->data) 
          {  pc->next = pa;   pc = pa;   pa = pa->next;  }
          else { pc->next = pb;   pc = pb;   pb = pb->next; }
        }
        pc->next = pa ? pa : pb;  // 插入剩余段
        p = Lc->next;
          while(p){
              cout << p->data << ' ';
              p = p->next;
          }
          cout<<endl;
          return 0;
      }
    
      int main()
      {
          int i,it,len;
          LinkList ll_1,ll_2;
        cin >> len;
        for(i=1;i<=len;i++){
            cin >> it;
            ll_1.LL_insert(i,it);
        }
        cin >> len;
        for(i=1;i<=len;i++){
            cin >> it;
            ll_2.LL_insert(i,it);
        }
        ll_2.LL_merge(ll_1.LL_index(0),ll_2.LL_index(0));  
        return 0;
      }

    因为最近笔记本B面裂了准备去修,复杂些的会优先加上注释,所以在家先把代码和题目贴上来以后补文字,有疑问可以在下面留言。 

  • 相关阅读:
    Leetcode 15 3Sum
    Leetcode 383 Ransom Note
    用i个点组成高度为不超过j的二叉树的数量。
    配对问题 小于10 1.3.5
    字符矩阵的旋转 镜面对称 1.2.2
    字符串统计 连续的某个字符的数量 1.1.4
    USACO twofive 没理解
    1002 All Roads Lead to Rome
    USACO 5.5.1 求矩形并的周长
    USACO 5.5.2 字符串的最小表示法
  • 原文地址:https://www.cnblogs.com/nathaneko/p/6491238.html
Copyright © 2011-2022 走看看