您的位置:首页 > 编程语言

编程实现合并两个有序单链表

2012-02-29 20:11 615 查看
编程实现合并两个有序(假定为降序)单链表的函数,输入为两个有序链表的头结点,函数返回合并后新的链表的头节点,

要求:不能另外开辟新的内存存放合并的链表。

合并函数声明如下:node *merge_sorted_list( node * head1, node *head2);

//重要方法:

node merge_sorted_list(const node head1,const node head2)
{
if((NULL == head1) && (NULL == head1))
{
return NULL;
}
else if(NULL == head1)
{
return head2;
}
else if(NULL == head2)
{
return head1;
}
else
{
node head = NULL,p1 = NULL,p2 = NULL;

if(head1->value >= head2->value)
{
head = head1;
p1 = head1->next;

p2 = head2;
}
else
{
head = head2;
p2 = head2->next;

p1 = head1;
}

node p = head;

while((NULL != p1) && (NULL != p2))
{
if(p1->value >= p2->value)
{

p->next = p1;

p = p1;

p1 = p1->next;
}
else
{

p->next = p2;

p = p2;

p2 = p2->next;
}
}

p->next = p1 ? p1 : p2;
//if(NULL != p1->next)
//	p->next = p1;
//else
//	p->next = p2;
return head;
}
}

采用递归的方法实现:

Node * MergeRecursive(Node *head1 , Node *head2)
{
if ( head1 == NULL )
return head2 ;

if ( head2 == NULL)
return head1 ;

Node *head = NULL ;

if ( head1->value > head2->value )
{
head = head1 ;
head->next = MergeRecursive(head1->next,head2);
}
else
{
head = head2 ;
head->next = MergeRecursive(head1,head2->next);
}

return head ;
}


//掌握好了 吗?

//不带头节点的链表
#include <stdio.h>

#include <malloc.h>

struct Node
{
int value;
struct Node *next;
};

typedef struct Node * node;

node CreateList(int iStart,int num)
{
node head = NULL,p = NULL,q = NULL;

for(int i = num;i > 0 ;i --)
{
p = (node)malloc(sizeof(struct Node));
p->value = iStart + i;

if(head == NULL)
{
head = p;
}
else
{
q->next = p;
}
q = p;
}

p->next = NULL;

return head;
}

node merge_sorted_list(node head1,node head2)
{
if((NULL == head1) && (NULL == head2))
{
return NULL;
}
else if(NULL == head1)
{
return head2;
}
else if(NULL == head2)
{
return head1;
}
else
{
node p = NULL,p1 = NULL,p2 = NULL;

if(head1->value >= head2->value)
{
p = head1;
p1 = head1->next;

p2 = head2;
}
else
{
p = head2;
p2 = head2->next;

p1 = head1;
}

while((NULL != p1) && (NULL != p2))
{
if(p1->value >= p2->value)
{

p->next = p1;

p = p1;

p1 = p1->next;
}
else
{

p->next = p2;

p = p2;

p2 = p2->next;
}
}
p->next = p1 ? p1 : p2;

return head1->value >= head2->value ? head1 : head2;
}
}

void display(node head)
{
node p = head;

while(NULL != p)
{
printf("%3d",p->value);

p = p->next;
}
printf("\n");
}

int main()
{
node head1 = NULL ,head2 = NULL,head = NULL;

head1 = CreateList(5,6);
head2 = CreateList(5,6);

display(head1);
display(head2);

head = merge_sorted_list(head1,head2);
display(head);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 null merge struct list p2p
相关文章推荐