【剑指offer】合并两有序单链表

   九度OJ上AC,采用归并的思想递归实现。

题目描述:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(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

    AC代码:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3.   
  4. typedef int ElemType;  
  5.   
  6. typedef struct Node  
  7. {  
  8.     ElemType data;  
  9.     struct Node *next;  
  10. }Node,*pNode;  
  11.   
  12. /* 
  13. 合并两个升序链表,合并后的链表依然升序排列 
  14. */  
  15. pNode MergeList(pNode pHead1,pNode pHead2)  
  16. {  
  17.     if(pHead1 == NULL)  
  18.         return pHead2;  
  19.     if(pHead2 == NULL)  
  20.         return pHead1;  
  21.   
  22.     pNode pMergeHead = NULL;  
  23.     if(pHead1->data > pHead2->data)  
  24.     {  
  25.         pMergeHead = pHead2;  
  26.         pMergeHead->next = MergeList(pHead1,pHead2->next);  
  27.     }  
  28.     else  
  29.     {  
  30.         pMergeHead = pHead1;  
  31.         pMergeHead->next = MergeList(pHead2,pHead1->next);  
  32.     }  
  33.     return pMergeHead;  
  34. }  
  35.   
  36. int main()  
  37. {  
  38.     int n,m;  
  39.     while(scanf("%d %d",&n,&m) != EOF)  
  40.     {  
  41.         pNode pHead1 = NULL;  
  42.         if(n > 0)  
  43.         {  
  44.             int i,data;  
  45.             scanf("%d",&data);  
  46.             pHead1 =(pNode)malloc(sizeof(Node));  
  47.             if(pHead1 == NULL)  
  48.                 exit(EXIT_FAILURE);  
  49.             pHead1->data = data;  
  50.             pHead1->next = NULL;  
  51.   
  52.             pNode pCur = pHead1;  
  53.             for(i=0;i<n-1;i++)  
  54.             {  
  55.                 scanf("%d",&data);  
  56.                 pNode pNew =(pNode)malloc(sizeof(Node));  
  57.                 if(pNew == NULL)  
  58.                     exit(EXIT_FAILURE);  
  59.                 pNew->data = data;  
  60.                 pNew->next = NULL;  
  61.                 pCur->next = pNew;  
  62.                 pCur = pCur->next;  
  63.             }  
  64.         }  
  65.   
  66.         pNode pHead2 = NULL;  
  67.         if(m > 0)  
  68.         {  
  69.             int i,data;  
  70.             scanf("%d",&data);  
  71.             pHead2 =(pNode)malloc(sizeof(Node));  
  72.             if(pHead2 == NULL)  
  73.                 exit(EXIT_FAILURE);  
  74.             pHead2->data = data;  
  75.             pHead2->next = NULL;  
  76.   
  77.             pNode pCur = pHead2;  
  78.             for(i=0;i<m-1;i++)  
  79.             {  
  80.                 scanf("%d",&data);  
  81.                 pNode pNew =(pNode)malloc(sizeof(Node));  
  82.                 if(pNew == NULL)  
  83.                     exit(EXIT_FAILURE);  
  84.                 pNew->data = data;  
  85.                 pNew->next = NULL;  
  86.                 pCur->next = pNew;  
  87.                 pCur = pCur->next;  
  88.             }  
  89.         }  
  90.   
  91.         pNode pMergeHead = MergeList(pHead1,pHead2);  
  92.         if(pMergeHead == NULL)  
  93.             printf("NULL\n");  
  94.         else  
  95.         {  
  96.             pNode pCur = pMergeHead;  
  97.             while(pCur != NULL)  
  98.             {  
  99.                 //这里主要时要注意输出的格式  
  100.                 if(pCur->next == NULL)  
  101.                     printf("%d\n",pCur->data);  
  102.                 else  
  103.                     printf("%d ",pCur->data);  
  104.                 pCur = pCur->next;  
  105.             }  
  106.         }  
  107.     }  
  108.     return 0;  
  109. }  
/**************************************************************
     Problem: 1519
     User: mmc_maodun
     Language: C
     Result: Accepted
     Time:250 ms
     Memory:4080 kb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值