顺序单链表归并排序-腾讯笔试题
对单链表进行归并排序,单链表与数组相比只能顺序访问每个元素,因此在使用二路归并排序时关键在于找到链表的中间结点将链表一分为二:可以利用一个步长为2的指针和一个步长为1的指针同时遍历单链表,当步长为2的`指针指向链表最后一个结点或者最后一个结点的下一个结点时,步长为1的指针即指向链表的中间结点。然后是两个有序单链表的合并问题。时间复杂度为O(N*logN),空间复杂度为O(1)。
//mergesort for LinkList
#include
#include
#include
using namespace std;
typedef struct Node {
int data;
struct Node* next;
} LNode, *LinkList;
Node* getMiddle(LinkList L) {//无头结点链表
LNode *mid, *midl, *p;
midl = NULL, p = mid = L;
while (p != NULL && p->next != NULL) {//利用快慢指针找链表的中间位置并将链表1分为2
p = p->next->next;
midl = mid;
mid = mid->next;
}
midl->next = NULL;//将链表1分2
return mid;
}
void printList(LinkList L) {
LNode *p;
p = L;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;;
}
void Merge(LinkList &La, LinkList Lb) {//将两个有序链表La和Lb合并成一个有序链表La
LNode *pa = La, *pb = Lb;
LinkList Lc = NULL;
LNode *q = NULL;
if (pa->data <= pb->data) {
Lc = q = pa;
pa = pa->next;
}
else {
Lc = q = pb;
pb = pb->next;
}
while (pa != NULL && pb != NULL) {
if (pa->data <= pb->data) {
q->next = pa, pa = pa->next, q = q->next;
}
else {
q->next = pb, pb = pb->next, q = q->next;
}
}
if (pa == NULL) q->next = pb;
else if (pb == NULL) q->next = pa;
La = Lc;//La重新指向合并后的链表
}
void MergeSort(LinkList &L) {//注意引用的使用
if (L == NULL || L->next == NULL) return;//当链表长度小于等于1时即不用再分
LinkList La, Lb;
Lb = getMiddle(L);
La = L;
MergeSort(La);
MergeSort(Lb);
Merge(La, Lb);
L = La;//返回的结果代回
}
void DestroyList(LinkList &L) {
LNode *p, *q;
p = q = L;
while (p != NULL) {
q = q->next;
free(p);
p = q;
}
}
int main() {
int len = 10, i;
LinkList L;
LNode *p;
if ((L = (LinkList)malloc(sizeof(LNode))) == NULL) {
cerr << "Error in allocate memory!" << endl;
return -1;
}
srand(time(NULL));
L->data = rand() mod 1000; L->next = NULL;
for (i = 1; i < len; i++) {
if ((p = (LNode*)malloc(sizeof(LNode))) == NULL) {
cerr << "Error in allocate memory!" << endl;
DestroyList(L);
return -1;
}
p->data = rand() mod 1000;
p->next = L->next;
L->next = p;//头插
}
cout << "The list before sorting:" << endl;
printList(L);
MergeSort(L);
cout << "The list after sorting:" << endl;
printList(L);
DestroyList(L);
-
河北公卫医师资格综合笔试考试
日期时间考试科目9月12日(星期六)上午9:00—11:30第一单元下午14:00—16:30第二单元9月13日(星期日)上午9:00—11:30第三单元下午14:00—16:30第四单元考前一天准备和考中注意事项:1、重点复习公共科目和基础科目。内外妇儿是重点不假,但轻视甚至放弃公共科目是绝对错误的,往...
-
2015年上海农村商业银行业培笔试经验
我在上海开放大学的考场,外面在施工,靠窗坐,不过抗噪音能力还好,就正常地做题了。机房挺热的,很容易口渴,自备一下饮用水比较好。。因为怕时间来不及,默默记了个题型,不过好像每年不一样的。因为是速记的`,2个小时150道题,大概是言语类20题,数学类10题,逻辑类20题,资料分析2...
-
2015年国电集团财务岗笔试经验
行测:90min70道题,本人算一下均匀每道题根本就一分钟左右,于是......楼主就!傻叉了...后面时间极度慌张,本着三长一短就选短三短一长就选长BC永远萌萌哒的准绳,在五分钟内疾速过了十道题......不过材料题倒是很简单,分分钟搞定专业题(嗯,靠谱儿):先说一下,楼主之前看...
-
小升初面试笔试及入学测试考察知识点大全
一、面试题测查一:要求每一位同学做简短的自我介绍测查二:用英文来回答问题,比如说,有这样一道题目:假如你有一位机器人姐妹或者兄弟,你会有什么想法?你会怎么样做?请简单说明一下。这类问题并没有一个标准的答案,考察的就是一个人的随机应变能力,当然也是对英语口语的侧...