zoukankan      html  css  js  c++  java
  • 剑指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;
        }
    }
     
  • 相关阅读:
    构建之法阅读笔记07
    7-第一阶段SCRUM冲刺
    第一阶段个人冲刺博客第十天
    第一阶段个人冲刺博客第九天
    第九周学习进度博客
    java项目(学习和研究)
    让计算机干活
    os基础
    树和图的一些算法
    java代码理解
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13466678.html
Copyright © 2011-2022 走看看