合并两个排序的链表

题目描述:

  输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

算法思想:

  这个题目的思想是通过两个指针分别指向两个链表,递归比较两个链表的值得大小,然后赋值给新建的头结点。直到结束。这里需要注意的就是,我们需要检查两个传进来的链表是否为空;

算法实现:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 
 5 typedef struct ListNode{
 6     int data;
 7     struct ListNode *next;
 8 }ListNode;
 9 
10 ListNode * Merge(ListNode *pHead1, ListNode *pHead2){
11     if(pHead1 == NULL){                     //检查是否为空
12         return pHead2;
13     }
14     if(pHead2 == NULL){
15         return  pHead1;
16     }
17     
18     ListNode *pHead = NULL;
19     
20     if(pHead1->data < pHead2->data){           //递归合并两个链表
21         pHead = pHead1;
22         pHead->next = Merge(pHead1->next, pHead2);
23     }
24     else{
25         pHead = pHead2;
26         pHead->next = Merge(pHead1, pHead2->next);
27     }
28     
29     return pHead;
30 }
31 
32 ListNode *CreateList(int x){                              //创建链表
33     long num;
34     ListNode *pHead = NULL;
35     ListNode *p = NULL;
36       
37     while(x-- > 0){
38             cin>>num;  
39             ListNode* pNew = new ListNode();  
40             if(pNew == NULL){
41                     exit(EXIT_FAILURE);
42                 }
43             pNew->data = num;  
44             pNew->next = NULL;  
45          
46             if(pHead == NULL)  
47             {  
48                 pHead = pNew;  
49                 p = pHead;  
50             }  
51             else
52             {  
53                 p->next = pNew;  
54                 p = p->next;  
55             }   
56         }
57     return pHead; 
58 } 
59 
60 int main(){
61     int m, n;
62     
63     ListNode *p1 = NULL;
64     ListNode *p2 = NULL;
65     ListNode *result = NULL;
66     
67     while(cin>>m>>n){
68         p1 = CreateList(m);
69         p2 = CreateList(n);
70         result = Merge(p1, p2);
71         
72         if(result == NULL){
73             cout<<"NULL"<<endl;
74         }
75         else{
76             ListNode *index = result;
77             while(index != NULL){
78                 cout<<index->data<<' ';
79                 index = index->next;
80             }
81             cout<<endl;
82         }
83     }
84 }

参考数据:

《剑指offer》

转载于:https://www.cnblogs.com/dormant/p/5333214.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值