合并两个排序的链表19.21

题目描述

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

解题过程:

遇到链表题,老是会有抠边界的问题,临场思路要是不清晰就会出问题,就这个问题,我做了以下的总结:

第1步:审清题目:合并后是有序的,而且两个链表本身也是有序的

第2步:在边界上抠不清楚,代码冗余度很高,分块处理:

            1)把特殊情况拎出来先处理,像个数不到要求,null的这种

            2)把普通的情况及正常运行的情况做一个循环处理

            3)把边界做一个总体处理

下面是我的解法

/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
               //1)特殊情况处理
        if(list1 == null && list2 == null)
            return null;
        else if(list1 == null)
            return list2;
        else if(list2 == null)
            return list1;
        //2)正常情况处理
        ListNode cur = new ListNode(0);
        ListNode list = cur;
        //只要出现一个是null就退出,临界情况交给后面处理
        while(list1!=null && list2!=null){
            int x = list1.val;
            int y = list2.val;
            if(x>y){
                cur.next = new ListNode(y);
                list2 = list2.next; //list2继续往后走,list1不动
            }
            else {
                cur.next = new ListNode(x);
                list1 = list1.next;
            }
            cur = cur.next;
           }
           //3)边界情况部分处理
           //到临界点,有一个是null或者两个都是null
            if(list1!=null && list2==null)
                cur.next = list1;
            else if(list1==null && list2!=null)
                cur.next = list2;
            else if(list1==null && list2==null)
                cur.next = null;
            return list.next;
            }
          }

运行时间:28ms

占用内存:9668k

 

大佬的递归做法,但我还是不太擅长递归,有时候想不明白。用的好,代码清晰简洁 ,用不好,自己被绕进去出不来,或者根本就进不去呵呵……

/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        //递归版本
        if(list1 == null)
            return list2;
        if(list2 == null)
            return list1;
        if(list1.val <= list2.val){
            list1.next = Merge(list1.next,list2);
            return list1;
        }
        else {
            list2.next = Merge(list1,list2.next);
            return list2;
         }
       }
}

运行时间:31ms

占用内存:9316k

 

递归方法总结:

        用递归一定要找到出口,而且在你退出一个递归向上回溯的时候,一定要更新递归出口,这样就很容易能找到头绪了。

第一步:先找递归出口,抓住后放到函数开头

第二步:使用函数开始往下递归过程,遇到出口,开始回溯

第三步:更新出口(这步最关键,记住,只要有了出口,一定要记得分析更新出口)

如果你们有什么好的想法,欢迎与我交流分享,如果你觉得我的博文对你有益,希望不吝点赞哦 !

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值