合并有序链表

题目:

 

 

 

思路:

思路一:其实一看到这个题我们首先会想到递归,其中比较绕的就是
new_list = l1;
            new_list.next = mergeTwoLists2(l1.next, l2);
这点代码,原因是他取出一个值小的节点,并改变了他的下一位节点的指向。
如A->C->E与B->D->F,第一步,若A最小,那么我这个时候用new_list代替A,那么它的下一个节点必然是其他节点中值最小的。第二部进入到了第二层,这时候new_list 又被赋值指向了B,但是你要记住在内存中A并没有变化,有的只是new_list这个代号被B用了,这时候B就自然而然的承接在A的下面然后B的下一位节点必然是其余中的最小的。以此类推,等递归到最后一层的时候,每次返回必然会自然而然的承接上自己的头结点,递归结束后的new_list便指向新链表的头结点的地址。
 
 
思路二:就是不用递归而用循环,归其缘由是递归会导致创建新的东西,层数越多,建的越多,消耗越大。而循环相对消耗小一些,但是会比较麻烦,写多点代码吧。不用递归的话要先手判断,两个链表的头结点的值,取其中小的,用两个变量进行存储。为什么要两个,因为一个用于循环是一层层往下面加节点,一个用于返回,不然你循环完了,却又给不出头结点,那不就废了嘛。

代码示例:

class ListNode {
    int val;
    ListNode next = null;
}
 
public class Solution {
    public static void main(String[] args) {
        ListNode l1 = new ListNode();
        ListNode l2 = new ListNode();
        l1.val = 1;
        l2.val = 2;
        ListNode top1 = l1;
        ListNode top2 = l2;
        for (int i = 3; i < 10; i = i + 2) {
            ListNode temp1 = new ListNode();
            temp1.val = i;
            top1.next = temp1;
            top1 = temp1;
 
            ListNode temp2 = new ListNode();
            temp2.val = i + 1;
            top2.next = temp2;
            top2 = temp2;
        }
        ListNode test1 = l1;
        ListNode test2 = l2;
        System.out.println("第一个链表");
        while (test1 != null) {
            System.out.println(test1.val);
            test1 = test1.next;
        }
 
        System.out.println("第二个链表");
        while (test2 != null) {
            System.out.println(test2.val);
            test2 = test2.next;
        }
        System.out.println("end");
        ListNode end = mergeTwoLists2(l1, l2);
        while (end != null) {
            System.out.println(end.val);
            end = end.next;
        }
 
    }
 
    /**
     * 使用递归的方式进行合并两个列表
     *
     * @param l1
     * @param l2
     * @return
     */
    public static ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
        if (l1 == null)
            return l2;
        if (l2 == null)
            return l1;
 
        ListNode new_list = null; //初始化链表头
        if (l1.val <= l2.val) {
            new_list = l1;
            new_list.next = mergeTwoLists2(l1.next, l2);
        } else {
            new_list = l2;
            new_list.next = mergeTwoLists2(l1, l2.next);
        }
 
        return new_list;
    }
 
    /**
     * 使用循环的方式进行合并两个列表
     *
     * @param l1
     * @param l2
     * @return
     */
    public static ListNode mergeTwoLists1(ListNode l1, ListNode l2) {
        if (l1 == null)
            return l2;
        if (l2 == null)
            return l1;
 
        ListNode new_list = null; //初始化链表头
        if (l1.val <= l2.val) {
            new_list = l1;
            l1 = l1.next;
        } else {
            new_list = l2;
            l2 = l2.next;
        }
        ListNode new_list_head = new_list; //建立一个指向头部的不变动的变量,因为new_list接下来会不断的往链表下成补充数据,直至底部
 
 
        while (l1 != null || l2 != null) {
            if (l1 != null && l2 != null) {
                if (l1.val < l2.val) {
                    new_list.next = l1;
                    l1 = l1.next;
                } else {
                    new_list.next = l2;
                    l2 = l2.next;
                }
            } else if (l1 == null) {
                new_list.next = l2;
                l2 = l2.next;
            } else if (l2 == null) {
                new_list.next = l1;
                l1 = l1.next;
            }
            new_list = new_list.next;
        }
        return new_list_head;
    }
 
 
}
posted @ 2020-12-23 15:05  忧愁的chafry  阅读(86)  评论(0编辑  收藏  举报