zoukankan      html  css  js  c++  java
  • 代码的鲁棒性......

    又是一道牛客网的问题。

    描述如下:

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

    解题思路:

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

    注:

    由于在指针操作的过程中经常涉及到形参和实参的问题,在非指针操作中我们可以很容易区分,但是当时指针时常常是我们容易犯错的,这里就是注意到当用一个临时变量指向一个节点的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
  • 相关阅读:
    Dungeon Master(BFS)
    Shuffle'm Up(串)
    分解素因子
    Snowflake Snow Snowflakes(查找)
    求素数(素数筛选+打表)
    A simple problem(并查集判环)
    Eqs(枚举+ hash)
    Squares(枚举+set 查找)
    从控制台输入10个人的年龄放入数组,将十个人的年龄求总和
    数组
  • 原文地址:https://www.cnblogs.com/daimadebanyungong/p/4922812.html
Copyright © 2011-2022 走看看