题解 | #牛牛的双链表求和#
牛牛的双链表求和
http://www.nowcoder.com/practice/efb8a1fe3d1f439691e326326f8f8c95
#include <stdio.h>
#include <stdlib.h>
typedef struct list{
int data;
struct list *next;
}list,*linklist;
//链表内容打印
void ptink(list *head)
{
struct list *point=head;
while(point!=NULL)
{
printf("%d ",point->data);
point=point->next;//while里面的判断其实是在判断point->next是否为NULL
}
putchar('\n');
}
#if 1
//头插法
list *headInsert(list *head1,int *arr1,int n)
{
int i;
list *headList = head1;
list *arrList = NULL;
for(i=n-1;i>=0;i--)
{
arrList = (list *)malloc(sizeof(list));
arrList->data = arr1[i];
arrList->next = headList;
headList = arrList;
}
head1 = headList;
return head1;
}
//尾插法
list *trailInsert(list *head2,int *arr2,int n)
{
int i;
list *headList = head2;
list *arrList = NULL;
for(i=0;i<n;i++)
{
arrList = (list *)malloc(sizeof(list));
arrList->data = arr2[i];
arrList->next = NULL; //将headList放在arrList->next,即arrList的数据是放在headList的前面的
//headList=head;
if(headList == NULL)
{
headList = arrList; //
head2 = headList;
}
else
{
while(headList->next != NULL)
{
headList = headList->next ;
}
headList->next = arrList;
}
}
return head2;
}
//求和链表
list *Sum(list *head,list *head1,list *head2)
{
list *List = NULL; //每个节点存数的
list *list0 = head; //临时头链表
list *list1 = head1;
list *list2 = head2;
while(list1 != NULL)
{
List = (list *)malloc(sizeof(list));
List->data = (list1->data)+ (list2->data) ;
List->next =NULL;
//尾插法
if(list0 == NULL)
{
list0 = List; //
head = list0;
}
else
{
while(list0->next !=NULL)
{
list0 = list0->next; //链表往后位移
}
list0->next = List;
}
list1 = list1->next;
list2 = list2->next;
}
return head;
}
int main()
{
int i,n;
scanf("%d",&n);
int arr1[n];
int arr2[n];
for(i=0;i<n;i++)
{
scanf("%d",&arr1[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&arr2[i]);
}
list *head = NULL;
list *head1 = NULL;
list *head2 = NULL;
head1 = headInsert(head1,arr1,n);
//ptink(head1);
head2 = trailInsert(head2,arr2,n);
//ptink(head2);
head = Sum( head, head1, head2);
ptink(head);
return 0;
}
#endif
#include <stdlib.h>
typedef struct list{
int data;
struct list *next;
}list,*linklist;
//链表内容打印
void ptink(list *head)
{
struct list *point=head;
while(point!=NULL)
{
printf("%d ",point->data);
point=point->next;//while里面的判断其实是在判断point->next是否为NULL
}
putchar('\n');
}
#if 1
//头插法
list *headInsert(list *head1,int *arr1,int n)
{
int i;
list *headList = head1;
list *arrList = NULL;
for(i=n-1;i>=0;i--)
{
arrList = (list *)malloc(sizeof(list));
arrList->data = arr1[i];
arrList->next = headList;
headList = arrList;
}
head1 = headList;
return head1;
}
//尾插法
list *trailInsert(list *head2,int *arr2,int n)
{
int i;
list *headList = head2;
list *arrList = NULL;
for(i=0;i<n;i++)
{
arrList = (list *)malloc(sizeof(list));
arrList->data = arr2[i];
arrList->next = NULL; //将headList放在arrList->next,即arrList的数据是放在headList的前面的
//headList=head;
if(headList == NULL)
{
headList = arrList; //
head2 = headList;
}
else
{
while(headList->next != NULL)
{
headList = headList->next ;
}
headList->next = arrList;
}
}
return head2;
}
//求和链表
list *Sum(list *head,list *head1,list *head2)
{
list *List = NULL; //每个节点存数的
list *list0 = head; //临时头链表
list *list1 = head1;
list *list2 = head2;
while(list1 != NULL)
{
List = (list *)malloc(sizeof(list));
List->data = (list1->data)+ (list2->data) ;
List->next =NULL;
//尾插法
if(list0 == NULL)
{
list0 = List; //
head = list0;
}
else
{
while(list0->next !=NULL)
{
list0 = list0->next; //链表往后位移
}
list0->next = List;
}
list1 = list1->next;
list2 = list2->next;
}
return head;
}
int main()
{
int i,n;
scanf("%d",&n);
int arr1[n];
int arr2[n];
for(i=0;i<n;i++)
{
scanf("%d",&arr1[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&arr2[i]);
}
list *head = NULL;
list *head1 = NULL;
list *head2 = NULL;
head1 = headInsert(head1,arr1,n);
//ptink(head1);
head2 = trailInsert(head2,arr2,n);
//ptink(head2);
head = Sum( head, head1, head2);
ptink(head);
return 0;
}
#endif

查看4道真题和解析