• leecode第二十一题(合并两个有序链表)


    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
            if(l1==NULL)//判断有一组为空的情况
                return l2;
            if(l2==NULL)
                return l1;
            
            if(l1->val>l2->val)//由于我设计的算法问题,需要明确知道第一个值谁小,不妨用l1小,若不满足,就倒一下
                return mergeTwoLists(l2,l1);
            ListNode* res=l1;//保存头指针,留待返回
            while(l2!=NULL)
            {
                while(l1->next!=NULL && l1->next->val<=l2->val)//直到找出l1下一个比当前l2值大的数,且不能为空
                    l1=l1->next;
                if(l1->next==NULL)//只要额外判断l1下个为空的情况,这个值肯定不会比l2大
                {
                    l1->next=l2;
                    break;
                }
                ListNode* l2_next=l2->next;//一定要记住当前l2的下个节点
                l2->next=l1->next;//这里一定要画图,特清晰,不画要崩溃
                l1->next=l2;//注意这里l1指针停在新加入的节点处
                l1=l1->next;
                l2=l2_next;//即便l2为空也不要紧啊
            }
            
            return res;
        }
    };

    分析:

    这次做的挺好的,只有一处错误,就是忘了设置l1的第一个值一定小于l2的第一个值。其他没有任何错误,做的如此顺利的原因在于我通过画图举例,尽可能把所有案例都想到了,然后对比图示写的(链表不画图纯靠脑子我会懵),好吧其实还是这个题简单。

    这个题给我做题的经验,就是先画图,举例,实现一般功能的案例,然后是边界,然后看算法行不,不行怎么办,最后总结好了再写,不然边写边想会写不好也想不对,万一要换算法就更麻烦了。

  • 相关阅读:
    六、Redis主从复制 
    五、AOF持久化
    四、RDB持久化
    三、数据类型
    二、redis的配置文件介绍
    第八章、堆
    九、补充
    八、Filter
    七、监听器和国际化
    六、JDBC
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10584455.html
Copyright © 2020-2023  润新知