剑指offer之合并两个排序的链表

题目描述

image.png

解法1

常规解法,但是一些细节之处还是不够熟练,考虑的不是很周到

/*
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 && list2 == null)    return null;
        if(list1 == null)    return list2;
        if(list2 == null)    return list1;
        ListNode head = new ListNode(-1);;
        ListNode temp  = head;
        while(list1 != null && list2 != null){
           
            if(list1.val < list2.val){
                temp.next = list1;
                list1 = list1.next;
                temp = temp.next;
            }
            else{
                temp.next = list2;
                list2 = list2.next;
                temp = temp.next;
            }
            
        }
        if(list1 != null){
            temp.next = list1;
        }
        if(list2 != null)
            temp.next = list2;
        return head.next;
    }
}

为了增加程序的健壮性,首先需要在方法的一开始进行特殊值判断,这个程序的整体结构还是参考了标准答案,自己写的代码非常杂糅,这是一个值得参考的思路
方法的最后返回值为head.next,哎自己第一时间怎么就没想到呢,也算是增加了一个经验吧

解法二

这个递归方法真的是太秀了,卧槽,无情

/*
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;
        ListNode head = null;
        if(list1.val < list2.val){
            head = list1;
            head.next = Merge(list1.next,list2);
        }
        else{
            head = list2;
            head.next = Merge(list1,list2.next);
        }
        return head;
    }
}

这个还是比较难想的,最后使用每个递归方法中的head,将两个链表连接起来,因为每个方法 对应一个栈帧,每个栈帧都有自己的局部变量表,所以每个递归方法中的head变量都是不一样的,作为返回值使两个链表中的节点连接起来,卧槽,无情。