代码的鲁棒性......

又是一道牛客网的问题。

描述如下:

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

解题思路:

这题可以用插入排序的思想解决。如果不喜欢复杂的操作就创建一个新链表来对两个链表合并,否则可以使用其中一个链表作为插入的链表,不过那样会有很多节点断链以及修复链的操作,我使用的是新链表的方法,用空间换时间。

注:

由于在指针操作的过程中经常涉及到形参和实参的问题,在非指针操作中我们可以很容易区分,但是当时指针时常常是我们容易犯错的,这里就是注意到当用一个临时变量指向一个节点的Next指针时在对该临时变量分配内存是不会对节点的next指针分配内存的,而只是对临时变量分配内存,如果操作错误,就会造成段错误和内存泄露问题,所以特别需要注意,建议在遇到这种情况时使用直接p->next = malloc()操作的方式或使用二级指针来进行操作,而不是使用临时变量tmp=p->next,然后在tmp=malloc()的形式,这样就不容易出错了.

 

下面是该题的代码:

 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 class Solution {
10 public:
11     ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
12     {
13               
14         if(pHead1 == NULL && pHead2 == NULL)
15         {
16             return NULL;    
17         }
18         
19         ListNode *merge_head,*merge_list;
20         merge_head = merge_list = (ListNode *)malloc(sizeof(ListNode));
21            merge_head->next = NULL;
22 
23         if(pHead1 != NULL && pHead2 != NULL)
24         {
25             if(pHead1->val < pHead2->val)
26             {
27                 merge_head->val = pHead1->val;    
28                 pHead1 = pHead1->next;
29             }
30             else
31             {
32                 merge_head->val = pHead2->val;
33                 pHead2 = pHead2->next;
34             }
35         }
36         else if(pHead1 == NULL)
37         {
38             merge_head->val = pHead2->val;
39             pHead2 = pHead2->next;
40             
41         }
42         else
43         {//pHead2 == NULL && pHead1 != NULL
44             merge_head->val = pHead1->val;
45             pHead1 = pHead1->next;
46         }
47         
48          /* 在这里赋值,后面malloc分配内存改变不了next,只是改变形参。
49           * 在这里赋值,后面malloc分配内存改变不了next,只是改变形参。
50           * 在这里赋值,后面malloc分配内存改变不了next,只是改变形参。
51           * 重要的事情说三遍
52           */
53          //merge_head = merge_head->next; 
54         
55         while(pHead1 != NULL && pHead2 != NULL)
56         {
57             merge_head->next = (ListNode *)malloc(sizeof(ListNode));
58             
59             if(pHead1->val < pHead2->val)
60             {
61                 merge_head->next->val = pHead1->val;
62                 pHead1 = pHead1->next;
63             }
64             else
65             {
66                 merge_head->next->val = pHead2->val;
67                 pHead2 = pHead2->next;
68             }
69             
70             merge_head = merge_head->next;
71             
72         }    
73         
74         while(pHead1 != NULL)
75         {
76             merge_head->next = (ListNode *)malloc(sizeof(ListNode));
77             merge_head->next->val = pHead1->val;
78             pHead1 = pHead1->next;
79             merge_head = merge_head->next;
80         }
81         
82         while(pHead2 != NULL)
83         {
84             merge_head->next = (ListNode *)malloc(sizeof(ListNode));
85             merge_head->next->val = pHead2->val;
86             pHead2 = pHead2->next;
87             merge_head = merge_head->next;
88         }
89         
90         return merge_list;
91         
92     }
93 };
View Code

 

转载于:https://www.cnblogs.com/daimadebanyungong/p/4922812.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值