单链
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
合并为有序链表
1、已知两个表链链head1和head2各自有序,把它合并成一链链链链链链链链
个表仍然有序,要求用链链链链链链链链链链链链 链链链方法。
#include
#include
struct Node
{
int num;
Node *next;
};
Node *Merge(Node *head1,Node *head2)
{
if(head1==NULL)
return head2;
if(head2==NULL)
return head1;
Node *head=NULL;
if(head1->numnum)
{
head=head1;
head->next=Merge(head1->next,head2);
}
else
{
head=head2;
head->next=Merge(head1,head2->next);
}
return head;
}
2、递增有序的2个并个数递递表合成一递增有序的递递表~不用任何递函递用
/*
递目描述: 2个你它两个并个递增有序的递递表~递把合成一有序
的递递表~分普通和不能用任何递函数2递方法
作者: xiaocui
递递: 2007.11.4
版本: v1.0
*/
/* 递明: 如果采用一般的做法~直接申递新的空递~递成一新的个递递表~直接递行递就可以得到整的有序序列~递相递比递递递。并体个
如果不能用任何递函~也就是不能利用数malloc分配存~就是要利用内递有的2个递表~递行元素交递得到最后有序的递表。*/
#include 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;
}
/* 下面递递不使用任何递函~ 利用交递的方法在原空递递递整有序。 方法是先定一递表数体确哪个
的第一递点的递小~把递递表的递递点作递合后递表的递递点~然后比递个个并2个当有序递表的前递点
的递~如果代表最后合递表的递小~递不用交递~否递把递交递~最后合递表始递保持递中并两个并两个
的小递。一递表由于交递了一元素~前元素可能影递递表的有序递增~递其递行递整使其保持另个个当响
递增有序~然后重递上述递作~直到一递表遍递递束~然后把剩余的递表递接起就行。个来*/
/* 递整递表的第一递点~使其递成递增有序 个*/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;
}