九度OJ-题目1519:合并两个排序的链表

来源:互联网 发布:永宏plc 编程口接线 编辑:程序博客网 时间:2024/05/16 05:00

题目链接地址:

九度OJ-题目1519:合并两个排序的链表


题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(hint: 请务必使用链表。)

输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数。
下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素。接下来一行包含m个元素,s(1<=t<=1000000)。

输出:
对应每个测试案例,
若有结果,输出相应的链表。否则,输出NULL。

样例输入:
5  2
1  3  5  7  9
2  4
0  0

样例输出:
1  2  3  4  5  7  9
NULL


解题思路:

(1)构造一个空链表head3用于存放合并后生成的链表;
(2)比较有序链表head1和head2中的元素,将较小的元素插入到链表head3的末尾;
(3)重复步骤(2),当链表head1和链表head2中的元素全部加入到链表head3后,算法运行结束。

  AC代码如下:

#include<stdio.h>#include<malloc.h> // 定义链表中的结点typedef struct LNode{  int data;              // 数据域  LNode * next;          // 指针域}Linklist; /*** 构造长度为len的单链表* @param len  链表中的元素个数* @return head  返回单链表的头指针*/Linklist * createLinklist(int len){   Linklist * head = (Linklist *)malloc(sizeof(Linklist));   // 创建头结点   head -> next = NULL;   Linklist * p = head;         // p始终指向链表中的最后一个结点   Linklist * s = NULL;         // s指向当前构造的结点   int i;   int data;   for(i = 1;i <= len;i++)   {       scanf("%d",&data);       s = (Linklist *)malloc(sizeof(Linklist));       s -> data = data;       s -> next = p -> next;       p -> next = s;           // 将s插入到p结点的后面       p = s;                   // p指向s   }   return head;} /*** 合并两个有序链表* @param head1  有序链表head1的头指针* @param head2  有序链表head2的头指针* @return 返回合并后链表的头指针*/Linklist * mergeTwoOrderLinklist(Linklist * head1,Linklist * head2){   Linklist * head3 = (Linklist *)malloc(sizeof(Linklist));  // 创建链表head3的头结点   head3 -> next = NULL;   Linklist * p1 = head1 -> next;   Linklist * p2 = head2 -> next;   Linklist * p3 = head3;   Linklist * s = NULL;                  // s指向链表head3正在构造的结点    // 当两个链表都不为空时,选择两个链表中较小的元素插入到链表head3中   while((p1 != NULL) && (p2 != NULL))   {       s = (Linklist *)malloc(sizeof(Linklist));       if((p1 -> data) < (p2 -> data))       {           s -> data = p1 -> data;           p1 = p1 -> next;       }       else       {           s -> data = p2 -> data;           p2 = p2 -> next;       }       s -> next = p3 -> next;       p3 -> next = s;       p3 = s;                          // p3始终指向链表head3中的最后一个结点   }    // 将链表head1中的剩余结点全部插入到head3中   while(p1 != NULL)   {       s = (Linklist *)malloc(sizeof(Linklist));       s -> data = p1 -> data;       p1 = p1 -> next;       s -> next = p3 -> next;       p3 -> next = s;       p3 = s;                          // p3始终指向链表head3中的最后一个结点   }    // 将链表head2中的剩余结点全部插入到head3中   while(p2 != NULL)   {       s = (Linklist *)malloc(sizeof(Linklist));       s -> data = p2 -> data;       p2 = p2 -> next;       s -> next = p3 -> next;       p3 -> next = s;       p3 = s;                          // p3始终指向链表head3中的最后一个结点   }   return head3;} /*** 打印单链表* @param head  被打印链表的头指针* @return void*/void printLinklist(Linklist * head){   Linklist * p = head -> next;   if(NULL == p)   {       printf("NULL\n");   }   else   {      while(p -> next != NULL)      {          printf("%d ",p -> data);          p = p -> next;      }      printf("%d\n",p -> data);              // 输出链表的最后一个元素   }} int main(){    int n,m;    Linklist * head1;       // 第1个有序链表    Linklist * head2;       // 第2个有序链表    Linklist * head3;       // 合并后生成的链表    while(EOF != scanf("%d%d",&n,&m))    {      head1 = createLinklist(n);      head2 = createLinklist(m);      head3 = mergeTwoOrderLinklist(head1,head2);      printLinklist(head3);    }    return 0;} /**************************************************************    Problem: 1519    User: blueshell    Language: C++    Result: Accepted    Time:280 ms    Memory:7488 kb****************************************************************/


0 0
原创粉丝点击