第5-6周练习题2020——2-3 链表拼接 (20分)

    科技2022-07-14  118

    本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:

    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

    思路 一开始看着是没有头结点的,直接写

    while(list1!=NULL&&list2!=NULL){ if(list1->data<list2->data){ head=list1; list1=list1->next; } else{ head=list2; list2=list2->next; } head=head->next; }

    后来发现 head=list1; list1=list1->next; head=head->next;//此时head指向list1 之后若运行 head=list2;//会导致list1节点指向list2改变list1结构答案错误 list2=list2->next; 后来改了方法 代码 AC代码

    struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2){ struct ListNode *c=(struct ListNode *)malloc(sizeof(struct ListNode )); struct ListNode *head=c; while(list1!=NULL&&list2!=NULL){ if(list1->data<list2->data){ head->next=list1; list1=list1->next; } else{ head->next=list2; list2=list2->next; } head=head->next; } if(list1!= NULL) head->next = list1;//后面全接上剩下的部分 else head->next = list2; return c->next; }
    Processed: 0.012, SQL: 8