本题目是意思是把两个有序的链表合成一个有序的链表,考察了归并算法和链表的操作。
代码也相对比较简单,简单说一下归并函数里三个指针的作用,sum是返回的第一个指针,cur是所要返回的链表里走到的位置,put是对于取到的l1或l2里的某一个指针节点。全部的可运行代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct ListNode{
int value;
ListNode *next;
};
ListNode *mergeTwoList(ListNode *l1,ListNode *l2)
{
ListNode *sum;
ListNode *cur;
ListNode *put;
sum=NULL;//will be returned
if((l1==NULL)||(l2==NULL))
return l1?l1:l2;
while(l1&&l2)
{
if(l1->value<l2->value)
{
put=l1;
l1=l1->next;
}
else
{
put=l2;
l2=l2->next;
}
if(sum==NULL)
{
sum=put;
cur=sum;
}
else
{
cur->next=put;
cur=cur->next;
}
}
if(l1)
cur->next=l1;
if(l2)
cur->next=l2;
return sum;
}
int main()
{
int n,m;
printf("Please input the first list number:");
while(scanf("%d",&m)!=EOF)
{
ListNode *h1=(ListNode*)malloc(sizeof(ListNode));
ListNode *p1=h1;
p1->next=NULL;
printf("Please input the first list:\n");
int tmp,i;
scanf("%d",&tmp);
p1->value=tmp;
for(i=0;i<m-1;i++)
{
scanf("%d",&tmp);
ListNode *q1=(ListNode*)malloc(sizeof(ListNode));
q1->value=tmp;
p1->next=q1;
p1=q1;
p1->next=NULL;
}
printf("Please input the second list number:");
scanf("%d",&n);
printf("Please input the second list:\n");
ListNode *h2=(ListNode*)malloc(sizeof(ListNode));
ListNode *p2=h2;
p2->next=NULL;
scanf("%d",&tmp);
p2->value=tmp;
for(i=0;i<n-1;i++)
{
scanf("%d",&tmp);
ListNode *q2=(ListNode*)malloc(sizeof(ListNode));
q2->value=tmp;
p2->next=q2;
p2=q2;
p2->next=NULL;
}
printf("After Merge:");
ListNode *list=mergeTwoList(h1,h2);
ListNode *p=list;
while(p)
{
printf("%d ",p->value);
p=p->next;
}
free(h1);
free(h2);
printf("\n");
printf("Please input the first list number:");
}
return 0;
}