• 剑指16.合并两个排序的链表


    题目描述

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

    思路

    可以使用递归实现,也可以用非递归。

    注意:需要考虑到很多很多特殊情况!!如边界条件;链表中的值有相同的情况;某一个链表中连续几个值都比另一个链表的当前值小(大)。

    解法1(递归)思路:当得到两个链表中值较小的头节点并把它链接到已经合并的链表之后,两个链表剩余的节点依然是排序的,因此可以用递归完成这一过程。

    解法2(非递归)思路:类似于归并排序中子序列的合并过程,不断比较两个链表的val值,然后判断哪个节点需要优先添加到合并链表尾部。

     

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

     解法2(非递归):

    /*
    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 = new ListNode(-1);//初始化合并链表的头节点
            ListNode cur = head; //该节点始终指向合并链表的尾部
            while(list1 != null && list2 != null){
                if(list1.val <= list2.val){
                    cur.next = list1;
                    list1 = list1.next;
                }else{
                    cur.next = list2;
                    list2 = list2.next;
                }
                cur = cur.next; //更新当前节点,使其始终指向合并链表的尾部
            }
            if(list1 != null)
                cur.next = list1;
            if(list2 != null)
                cur.next = list2;
            return head.next;
        }
    }
     
  • 相关阅读:
    get请求中文乱码问题
    JDBC
    SpringSecurity
    IDEA中创建项目
    Vue路由传参的几种方式
    vue-cli搭建与使用
    docker发布springboot项目
    css伪类的使用
    java实体类序列化与反序列化
    docker网络
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13466678.html
Copyright © 2020-2023  润新知