编者注:考题版权归属版权方,作答代码版权归属编者,请勿私自盗用。本代码仅供参考,还请各位读者不吝赐教。
正确作答出这个程序前,发现测试点老是段错误或者运行超时,心态爆炸,然后准备CSDN上面COPY一手,谁都不爱。结果发现自己能力有限,没法短时间消化其他大佬的代码,于是搞出了自认为较为通俗易懂的代码。当然,本篇的通过代码或许有进步空间,还请各位读者不吝赐教
本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下
struct ListNode {
int data;
struct ListNode *next;
};
函数接口定义:
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
其中list1和list2是用户传入的两个按data升序链接的链表的头指针;函数mergelists将两个链表合并成一个按data升序链接的链表,并返回结果链表的头指针
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *list1, *list2;
list1 = createlist();
list2 = createlist();
list1 = mergelists(list1, list2);
printlist(list1);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
1 3 5 7 -1
2 4 6 -1
输出样例:
1 2 3 4 5 6 7
通过代码:(编者注:考题版权归属版权方,作答代码版权归属编者,请勿私自盗用。本代码仅供参考,还请各位读者不吝赐教。)
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
struct ListNode *l1 = list1,*l2 = list2;
struct ListNode *head,*p;
if(l1 == NULL||l2 == NULL)
return NULL;//判断两个链表是否为空
if((l1->data)>(l2->data))
{
head = l2;
p = head;
l2 = l2->next;
}//目标返回头结点的赋值
else{
head = l1;
p = head;
l1 = l1->next;
}//目标返回头结点的赋值
while(l1!=NULL&&l2!=NULL)//此处先进行了等长链表的合并
{
if((l1->data)>(l2->data))
{
p->next = l2;
p = p->next;
l2 = l2->next;
}
else{
p->next = l1;
p = p->next;
l1 = l1->next;
}
}
while(l1!=NULL||l2!=NULL)//此处检查是否有链表元素未被录入
{
if(l1)
{
p->next = l1;
p = p->next;
l1 = l1->next;
}
else{
p->next = l2;
p = p->next;
l2 = l2->next;
}
}
p->next = NULL;//记得赋值NULL,不然有概率不通过23333
return head;
}