几道笔试题的解法(一)
来源:互联网 发布:mac os x 10.13 下载 编辑:程序博客网 时间:2024/05/01 16:44
题目: 编写一个链表合并程序。存在2个有序链表list1,list2,要求合并为有序链表list3。
分析: 本题主要考察链表的创建和合并(有序的插入)
代码如下:(声明:部分代码参考自网上)
#include "stdafx.h" #include <iostream> using namespace std; /* 单链表节点*/ struct node { int value; node* next; }; /* 给单链表添加节点*/ void insertNode(node* head, int value) { node* p = head->next; if ( p == NULL ) { p = new node; p->value = value; p->next = NULL; head->next = p; return; } while ( p->next != NULL ) { p = p->next; } node* tmp = new node; tmp->value = value; tmp->next = NULL; p->next = tmp; } /* 遍历输出链表节点*/ void print(node* head) { node* p = head->next; while ( p != NULL ) { cout << p->value << " "; p = p->next; } cout << endl; } /* 利用一般的方法进行合并,形成整体递增有序*/ node* formalMerge(node* headA, node* headB) { node* head = new node; head->next = NULL; node* p = headA->next; node* q = headB->next; if ( p == NULL ) { return headB; } if ( q == NULL ) { return headA; } while ( (p != NULL) && (q != NULL) ) { if ( p->value == q->value ) { insertNode(head, p->value); insertNode(head, q->value); p = p->next; q = q->next; } else if ( p->value < q->value ) { insertNode(head, p->value); p = p->next; } else if ( p->value > q->value ) { insertNode(head, q->value); q = q->next; } } while ( p != NULL ) { insertNode(head, p->value); p = p->next; } while ( q != NULL ) { insertNode(head, q->value); q = q->next; } return head; } /* 调整链表的第一个节点,使其变成递增有序*/ void chg2sort(node* head, node* &p) { if (head->next == NULL ) //没有节点,直接返回 { return; } node* s = head; while ( s->next != p ) //s指向p的前一个节点 { s = s->next; } //下面的一段找到第一个大于p节点值的节点 node* q = p; node* r = q; while ( q != NULL ) { if ( q->value <= p->value ) { r = q; //r始终指向q的前一个节点 q = q->next; } else { break; } } //下面调整指针,其实可以统一写出来,为了阅读清晰把q为NULL和非NULL分开写出来 if ( q == NULL ) { r->next = p; s->next = p->next; p->next = NULL; } else if ( q != NULL ) { s->next = p->next; r->next = p; p->next = q; } //由于链表进行了调换,当前链表指针也需要改变 p = s->next; } node* merge(node* head1, node* head2) { node* head; //合并后的头指针 node* p = head1->next; node* q = head2->next; //有一个链表为空的情况,直接返回另一个链表 if ( p == NULL ) { head = head2; return head; } else if ( q == NULL ) { head = head1; return head; } //两个都不为空,先确定哪个链表作为合并后的链表 if ( (p != NULL) && (q != NULL) ) { if ( p->value < q->value ) { head = head1; } else { head = head2; } } node* p_prior; //始终指向p节点的前一个节点 node* q_prior; while ( (p != NULL) && (q != NULL) ) { if ( p ->value < q->value ) { if ( head == head1 ) { p_prior = p; p = p->next; } else if ( head == head2 ) { //进行当前节点值的交换 int tmp = p->value; p->value = q->value; q->value = tmp; chg2sort(head1, p); //交换元素后的调整 q_prior = q; q = q->next; } } else if ( p->value == q->value ) { p_prior = p; p = p->next; q_prior = q; q = q->next; } else if ( p->value > q->value ) { if ( head == head1 ) { int tmp = p->value; p->value = q->value; q->value = tmp; chg2sort(head2, q); p_prior = p; p = p->next; } else if ( head == head2 ) { q_prior = q; q = q->next; } } } if ( p != NULL ) { q_prior->next = p; } if ( q != NULL ) { p_prior->next = q; } return head; } int main() { /* 建立有序链表A */ int a[5] = {1, 5, 8, 10, 20}; node* headA = new node; headA->next = NULL; for (int i = 0; i < 5; ++i) { insertNode(headA, a[i]); } print(headA); /* 建立有序链表B */ int b[3] = {3, 4, 9}; node* headB = new node; headB->next = NULL; for (int i = 0; i < 3; ++i) { insertNode(headB, b[i]); } print(headB); /* 利用简单合并的方法合并成整体有序*/ node* head = formalMerge(headA, headB); print(head); int c[3] = {5, 4, 9}; node* headC = new node; headC->next = NULL; for (int i = 0; i < 3; ++i) { insertNode(headC, c[i]); } print(headC); //test chg2sort chg2sort(headC, headC->next); print(headC); head = merge(headA, headB); print(head); return 0; }
- 几道笔试题的解法(一)
- 几道笔试题的解法(二)
- 几道笔试题的解法(三)
- 几道笔试题的解法(四)
- 几道笔试题的解法(五)
- 几道笔试题的解法(六)
- 几道笔试题的解法(七)
- 几道笔试题的解法(八)
- 一著名软件公司的java笔试算法题!(我自己的解法)
- 一个笔试题的递归解法
- 一道笔试题的搞笑解法
- 几道笔试题
- 几道笔试题
- 几道笔试题
- 几道笔试题
- 几道笔试题
- 几道笔试题
- 几道笔试题
- ASP.net的身份验证方式有哪些?分别是什么原理?
- Silverlight 多点触控中图形的放大缩小
- 区别:Delete和Truncate
- Hadoop入门
- Linux :共享函数库的管理
- 几道笔试题的解法(一)
- c++之学习程序继承public(修改)
- 使用windows 7系统的System帐户
- asp.net数据库连接及GridView绑定
- 电脑高手常用的5个按钮
- ipchains参数介绍[引用]
- 无法生成临时类(result=1),的一种解决方法
- Linux下文件查找Find使用实例
- Struts 1和Struts 2的区别和对比