面试题17 合并两个排序的链表

来源:互联网 发布:我的世界js物品攻击力 编辑:程序博客网 时间:2024/05/17 03:05
题目描述:

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

输入:

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

输出:

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

样例输入:
5 21 3 5 7 92 40 0
样例输出:
1 2 3 4 5 7 9NULL

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /********************************* 
  2. *   日期:2013-11-23 
  3. *   作者:SJF0115 
  4. *   题号: 题目1519:合并两个排序的链表 
  5. *   来源:http://ac.jobdu.com/problem.php?pid=1519 
  6. *   结果:AC 
  7. *   来源:剑指Offer 
  8. *   总结: 
  9. **********************************/  
  10. #include<iostream>  
  11. #include <stdio.h>  
  12. #include <malloc.h>  
  13. #include <string.h>  
  14. using namespace std;  
  15.   
  16. typedef struct ListNode{  
  17.     int value;  
  18.     struct ListNode* next;  
  19. }ListNode;  
  20.   
  21. //打印链表  
  22. void OutPut(ListNode*head){  
  23.     if(head == NULL){  
  24.         printf("NULL\n");  
  25.     }  
  26.     else{  
  27.         ListNode *p;  
  28.         p = head->next;  
  29.         while(p != NULL){  
  30.             //如果是最一个  
  31.             if(p->next == NULL){  
  32.                 printf("%d\n",p->value);  
  33.             }  
  34.             else{  
  35.                 printf("%d ",p->value);  
  36.             }  
  37.             p = p->next;  
  38.         }  
  39.     }  
  40. }  
  41. //创建链表  
  42. ListNode* CreateList(ListNode *head,int n){  
  43.     ListNode *newNode,*p;  
  44.     p = head;  
  45.     for(int i = 0;i < n;i++){  
  46.         newNode = (ListNode*)malloc(sizeof(ListNode));  
  47.         scanf("%d",&newNode->value);  
  48.         newNode->next = NULL;  
  49.         p->next = newNode;  
  50.         p = newNode;  
  51.     }  
  52.     return head;  
  53. }  
  54. ListNode* Merge(ListNode*head1,ListNode*head2){  
  55.     //head1,head2带有头结点  
  56.     if(head1->next == NULL && head2->next == NULL){  
  57.         return NULL;  
  58.     }  
  59.     //只有第一个字符串,无需合并,直接输出  
  60.     else if(head2->next == NULL){  
  61.         return head1;  
  62.     }  
  63.     //只有第二个字符串,无需合并,直接输出  
  64.     else if(head1->next == NULL){  
  65.         return head2;  
  66.     }  
  67.     //合并  
  68.     else{  
  69.         ListNode *p1,*p2,*p3,*head;  
  70.         head = (ListNode*)malloc(sizeof(ListNode));  
  71.         head->next = NULL;  
  72.         p1 = head1->next;  
  73.         p2 = head2->next;  
  74.         p3 = head;  
  75.         while(p1 != NULL && p2 != NULL){  
  76.             if(p1->value < p2->value){  
  77.                 p3->next = p1;  
  78.                 p1 = p1->next;  
  79.             }  
  80.             else{  
  81.                 p3->next = p2;  
  82.                 p2 = p2->next;  
  83.             }  
  84.             p3 = p3->next;  
  85.         }  
  86.         //head1没有遍历完  
  87.         while(p1 != NULL){  
  88.             p3->next = p1;  
  89.             p1 = p1->next;  
  90.             p3 = p3->next;  
  91.         }  
  92.         //head2没有遍历完  
  93.         while(p2 != NULL){  
  94.             p3->next = p2;  
  95.             p2 = p2->next;  
  96.             p3 = p3->next;  
  97.         }  
  98.         return head;  
  99.     }  
  100. }  
  101. int main() {  
  102.     int i,n,m;  
  103.     while(scanf("%d %d",&n,&m) != EOF){  
  104.         ListNode *head1,*head2;  
  105.         head1 = (ListNode*)malloc(sizeof(ListNode));  
  106.         head2 = (ListNode*)malloc(sizeof(ListNode));  
  107.         head1->next = NULL;  
  108.         head2->next = NULL;  
  109.         //创建链表  
  110.         if(n != 0){  
  111.             head1 = CreateList(head1,n);  
  112.         }  
  113.         if(m != 0){  
  114.             head2 = CreateList(head2,m);  
  115.         }  
  116.         //合并排序  
  117.         head1 = Merge(head1,head2);  
  118.         //打印链表  
  119.         if(head1 == NULL){  
  120.             printf("NULL\n");  
  121.         }  
  122.         else{  
  123.             OutPut(head1);  
  124.         }  
  125.     }//while  
  126.     return 0;  
  127. }  

【方法二】

【解析】




【代码】

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /********************************* 
  2. *   日期:2013-11-23 
  3. *   作者:SJF0115 
  4. *   题号: 题目1519:合并两个排序的链表 
  5. *   来源:http://ac.jobdu.com/problem.php?pid=1519 
  6. *   结果:AC 
  7. *   来源:剑指Offer 
  8. *   总结: 
  9. **********************************/  
  10. #include<iostream>  
  11. #include <stdio.h>  
  12. #include <malloc.h>  
  13. #include <string.h>  
  14. using namespace std;  
  15.   
  16. typedef struct ListNode{  
  17.     int value;  
  18.     struct ListNode* next;  
  19. }ListNode;  
  20.   
  21. //打印链表  
  22. void OutPut(ListNode*head){  
  23.     if(head == NULL){  
  24.         printf("NULL\n");  
  25.     }  
  26.     else{  
  27.         ListNode *p;  
  28.         p = head;  
  29.         while(p != NULL){  
  30.             //如果是最一个  
  31.             if(p->next == NULL){  
  32.                 printf("%d\n",p->value);  
  33.             }  
  34.             else{  
  35.                 printf("%d ",p->value);  
  36.             }  
  37.             p = p->next;  
  38.         }  
  39.     }  
  40. }  
  41. //创建链表  
  42. ListNode* CreateList(ListNode *head,int n){  
  43.     ListNode *newNode,*p;  
  44.     p = head;  
  45.     for(int i = 0;i < n;i++){  
  46.         newNode = (ListNode*)malloc(sizeof(ListNode));  
  47.         scanf("%d",&newNode->value);  
  48.         newNode->next = NULL;  
  49.         p->next = newNode;  
  50.         p = newNode;  
  51.     }  
  52.     return head;  
  53. }  
  54. //递归  
  55. ListNode* Merge(ListNode*head1,ListNode*head2){  
  56.     if(head1 == NULL && head2 == NULL){  
  57.         return NULL;  
  58.     }  
  59.     else if(head2 == NULL){  
  60.         return head1;  
  61.     }  
  62.     else if(head1 == NULL){  
  63.         return head2;  
  64.     }  
  65.     //合并  
  66.     ListNode *head = NULL;  
  67.     if(head1->value < head2->value){  
  68.         head = head1;  
  69.         head->next = Merge(head1->next,head2);  
  70.     }  
  71.     else{  
  72.         head = head2;  
  73.         head->next = Merge(head1,head2->next);  
  74.     }  
  75.     return head;  
  76. }  
  77. int main() {  
  78.     int i,n,m;  
  79.     while(scanf("%d %d",&n,&m) != EOF){  
  80.         ListNode *head1,*head2;  
  81.         head1 = (ListNode*)malloc(sizeof(ListNode));  
  82.         head2 = (ListNode*)malloc(sizeof(ListNode));  
  83.         head1->next = NULL;  
  84.         head2->next = NULL;  
  85.         //创建链表  
  86.         if(n != 0){  
  87.             head1 = CreateList(head1,n);  
  88.         }  
  89.         if(m != 0){  
  90.             head2 = CreateList(head2,m);  
  91.         }  
  92.         //合并排序  
  93.         head1 = Merge(head1->next,head2->next);  
  94.         //打印链表  
  95.         if(head1 == NULL){  
  96.             printf("NULL\n");  
  97.         }  
  98.         else{  
  99.             OutPut(head1);  
  100.         }  
  101.     }//while  
  102.     return 0;  
  103. }  
0 1
原创粉丝点击