合并两个有序链表(java)

  • Post author:
  • Post category:java


题目:

将两个升序链表合并为一个新的

升序

链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]


1、# 自定义链表类;

重写toString方法,便于观察链表数据(可有可无);

/**
自定义链表类
*/

public class ListNode {

        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }

        @Override
        public String toString() {
                StringBuilder sb=new StringBuilder();
                ListNode next=null;
                sb.append("[");
                sb.append(val);
                next=this.next;
                while (next !=null){
                sb.append(",");
                sb.append(next.val);
                next=next.next;
                }
                sb.append("]");
                return sb.toString();
        }

}


2、# 实现方法

public class Solution21 {


    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //l1链表为空,则输出l2,否则输出l1
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
 //如果l1,l2不为空,则比较首节点值的大小,如果l1小则l1.next->(mergeTwoLists(l1.next,l2))
        } else if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
//反之则l2.next->(mergeTwoLists(l1,l2.next))
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }

    public static void main(String[] args) {

        ListNode l1=new ListNode(1);
        ListNode nextNode1=new ListNode(2);
        ListNode nextNode2=new ListNode(3);
        l1.next=nextNode1;
        nextNode1.next=nextNode2;

        ListNode l2=new ListNode(1);
        ListNode nextNode3=new ListNode(3);
        ListNode nextNode4=new ListNode(4);
        l2.next=nextNode3;
        nextNode3.next=nextNode4;


        System.out.println(mergeTwoLists(l1,l2));
    }
}


3、#图解


[1,2,3]                 [1,3,4]


1<1  false


[1,2,3]                  [3,4]        第1次递归     l2.next = mergeTwoLists(l1, l2.next);


1<3      true


[2,3]           [3,4]                 第2次递归    l1.next = mergeTwoLists(l1.next, l2);


2<3     true


[3]           [3,4]                    第3次递归    l1.next = mergeTwoLists(l1.next, l2);


3<3     false


[3]          [4]                      第4次递归     l2.next = mergeTwoLists(l1, l2.next);


3<4    true


null        [4]                      第5次递归    l1.next = mergeTwoLists(l1.next, l2);


l1=null   return l2           程序结束


return   [4]                      返回 4


return  l1  [3,4]              返回第5次递归结果


return l2  [3,3,4]            返回第4次递归结果


return  l1 [2,3,3,4]         返回第3次递归结果


retruen l1 [1,2,3,3,4]         返回第2次递归结果


return  l2 [1,1,2,3,3,4]         返回第1次递归结果



版权声明:本文为intmainreturn原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。