合并两个有序链表

此博客链接: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;

    }
}

运行结果正确:

 

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

 

posted @ 2020-04-08 15:17  萍2樱释  阅读(220)  评论(0编辑  收藏  举报