几道笔试题的解法(一)

来源:互联网 发布: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;

   }

}

//下面调整指针,其实可以统一写出来,为了阅读清晰把qNULL和非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;

}

 

 

 

原创粉丝点击