本篇与顺序表的合并题目相同,只不过用了链表的方式实现
#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面裂了准备去修,复杂些的会优先加上注释,所以在家先把代码和题目贴上来以后补文字,有疑问可以在下面留言。