Leetcode #21 Merge Two Sorted Lists 合并有序链表 解题报告

0 题外话

嗯,从这次开始我就把题目换一下,改成解题报告了,因为我小节小结总是不分,等有时间也去改下之前的解题报告咯~~

我算了下自己的速度,作为一个本学期的额外爱好,到现在21天刷了100题,速度也还算好,毕竟像今天这样基本一题没法刷的时间占到一周的一半多的时间。

1 解题思想

题目是给两个单链表,里面的数值都是有序的,现在要求他们合并成一个有序链表。

这道题的做法就是,从两个单链表的头结点开始分别设立两个指针p,q,和一个新的临时头结点prehead(结果),同时每次比较的时候,选择p q当中最小的一个,修改指针到prehead那条链表的末尾,然后移动指针。。当p或q有一个到末尾后,则将剩下的那一部分直接链入最终结果当中。

2 原题

Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

3 AC解

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
 /**
  *  合并有序的列表,设两个长度分别为n,m 那么时间复杂度为O(n+m)
  * 
  *  分别设两个指针,都从对应序列的起点开始,每次选择最小的一个,加入到新的链表当中
  * 
  *  值得学习的点:最开始我写的是每次比较厚都生成一个新的ListNode,后面才反应过来,对于链表的题,如果他没有要求的话,那么并不需要重新new,只需要每次都改变下指针就好
  * */

public class Solution {
    public ListNode mergeTwoLists1(ListNode l1, ListNode l2) {
        ListNode head=new ListNode(0);
        ListNode p=head;
        int val1,val2;
        while(l1!=null || l2!=null){
            val1=Integer.MAX_VALUE;
            val2=Integer.MAX_VALUE;
            if(l1!=null){  
                val1=l1.val;
            } 
            if(l2!=null){
                val2=l2.val;
            }  
            if(val1<val2){
                p.next=l1;
                l1=l1.next;
            } else{
                p.next=l2;
                l2=l2.next;
            }
            p=p.next;
        }
        return head.next;
    }
    /**
     * 这个版本充分利用了上述特性进行加速,注意判断l1 l2是否到结尾的时候,如果有一边为空,那么直接连接到另一个的当前位置返回就好
     * 
     * leetcode上都是1ms,不过这个方法更优
     * */
     public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode head=new ListNode(0);
        ListNode p=head;
        int val1,val2;
        while(l1!=null || l2!=null){
            val1=Integer.MAX_VALUE;
            val2=Integer.MAX_VALUE;
            if(l1!=null){  
                val1=l1.val;
            } else{
                p.next=l2;
                break;
            }
            if(l2!=null){
                val2=l2.val;
            } else{
                p.next=l1;
                break;
            }
            if(val1<val2){
                p.next=l1;
                l1=l1.next;
            } else{
                p.next=l2;
                l2=l2.next;
            }
            p=p.next;
        }
        return head.next;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值