zoukankan      html  css  js  c++  java
  • 合并两个有序链表

    此博客链接:https://www.cnblogs.com/ping2yingshi/p/12660142.html

    合并两个有序链表(87min)

    题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/

    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

    示例:

    输入:1->2->4, 1->3->4
    输出:1->1->2->3->4->4

    题解:

             思路:

                      1.新建一个链表。

                      2.比较两个链表的数,把数小的加入到新的链表中。

                       1)当其中一个链表为空时,直接返回另外一个链表。

                       2)当两个链表都不为空时,当l1中的数小于l2中的数时,把新建的链表l3指向l1,并把l1指向下一个数,同时l3也指向下一个数,当l1的中大于l2中的数,同理。

                       3)当一个链表先为空时,直接把l3指向另外一个链表。

            注意:最后返回时,返回新建链表头的next。

    超时代码:

    class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
             ListNode l3=new ListNode(0);
            while(l1!=null || l2!=null){
                if(l1!=null&&l2!=null){
                    if(l1.val < l2.val)
                    {
                    l3.next=l2;
                    l2=l2.next;
                    l3=l3.next;
                    }
                }
                if(l1!=null&&l2!=null){
                    if(l2.val<l1.val)
                    {
                    l3.next=l1;
                    l1=l1.next;
                    l3=l3.next;
                    }
                }
                if(l2==null&l1!=null)
                {
                    l3.next=l1;
                 
                }
                 if(l2!=null&l1==null)
                {
                    l3.next=l2;
               
                }
               
            }
            return l3;
            
    
        
        }
    }

    修改判断条件后还是超时

    class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
             ListNode l3=new ListNode(0);if(l1==null)
                return l2;
             if(l2==null)
                return l1;
            while(l1!=null && l2!=null){//修改这里
                    if(l1.val < l2.val)
                    {
                    l3.next=l2;
                    l2=l2.next;
                    l3=l3.next;
                    }
                
                    if(l2.val<l1.val)
                    {
                    l3.next=l1;
                    l1=l1.next;
                    l3=l3.next;
                    }
                }
                if(l2==null&l1!=null)
                {
                    l3.next=l1;
                 
                }
                 if(l2!=null&l1==null)
                {
                    l3.next=l2;
               
                }
               
            
            return head;
            
    
        
        }
    }

    把if后面的if改成else不超时,但是结果不对。(超时这里想到了,因为两个if中我没有判断等于情况,把其中一个if改成else 就会判断等于情况)

    代码:

    class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
             ListNode l3=new ListNode(0);if(l1==null)
                return l2;
             if(l2==null)
                return l1;
            while(l1!=null && l2!=null){
                    if(l1.val < l2.val)
                    {
                    l3.next=l2;
                    l2=l2.next;
                    l3=l3.next;
                    }
                
                    else//修改了这里
                    {
                       l3.next=l1;
                       l1=l1.next;
                       l3=l3.next;
                    }
                }
                if(l2==null&l1!=null)
                {
                    l3.next=l1;
                 
                }
                 else
                {
                    l3.next=l2;
                }
            return head;
        }
    }

    执行结果:

     发现是逻辑写错了,这里应该是谁小把谁放入l3中,修改代码,还是结果不对。

    代码:

    class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
             ListNode l3 =new ListNode(0);
             if(l1==null)
                return l2;
             if(l2==null)
                return l1;
            while(l1!=null && l2!=null){
                    if(l1.val < l2.val)
                    {
                       l3.next=l1;//修改了这里
                       l1=l1.next;
                       l3=l3.next;
                    }
                  else
                    {
                       l3.next=l2;
                       l2=l2.next;
                       l3=l3.next;
                    }
                }
                if(l2==null&l1!=null)
                    l3.next=l1;
                 else
                    l3.next=l2;
            return l3;
    
        }
    }

    执行结果:

     这里就输出了两个数,没有全部输出。

    参考类似思想代码,原来最后返回应该返回新建链表的头,修改代码:

    class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
             ListNode head =new ListNode(0);
             ListNode l3=head;
             if(l1==null)
                return l2;
             if(l2==null)
                return l1;
            while(l1!=null && l2!=null){
                    if(l1.val < l2.val)
                    {
                       l3.next=l1;
                       l1=l1.next;
                       l3=l3.next;
                    }
                  else
                    {
                       l3.next=l2;
                       l2=l2.next;
                       l3=l3.next;
                    }
                }
                if(l2==null&l1!=null)
                    l3.next=l1;
                 else
                    l3.next=l2;
            return head;
    
        }
    }

    执行结果多了一个新建链表表头的数0

    在返回链表时,返回链表头结点的next,除去第一个数0.

    代码如下:

    class Solution {
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
             ListNode head =new ListNode(0);
             ListNode l3=head;
             if(l1==null)
                return l2;
             if(l2==null)
                return l1;
            while(l1!=null && l2!=null){
                    if(l1.val < l2.val)
                    {
                       l3.next=l1;
                       l1=l1.next;
                       l3=l3.next;
                    }
                  else
                    {
                       l3.next=l2;
                       l2=l2.next;
                       l3=l3.next;
                    }
                }
                if(l2==null&l1!=null)
                    l3.next=l1;
                else
                    l3.next=l2;
            return head.next;
    
        }
    }

    运行结果正确:

     太不容易了,终于通过了。

  • 相关阅读:
    移动端iOS点击闪烁
    盒子布局(标准)
    zepto.js 自定义打包集成其他模块构建流程
    一种移动端position:absolute布局:
    CSS基础:text-overflow:ellipsis溢出文本显示省略号的详细方法_CSS教程
    ie8 下的半透明 background:rgba 与opacity失效 兼容办法
    在webstorm中编译less,以及压缩css
    JS截取字符串substr 和 substring方法的区别
    array数据处理
    git 使用小结
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/12660142.html
Copyright © 2011-2022 走看看