zoukankan      html  css  js  c++  java
  • 剑指Offer-合并两个排序的链表

    题目描述

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

    思路

    思路一(迭代):

    1. 首先处理空链表,当其中一个为空链表时,直接输出另一个;当两个均为空链表时,输出null。
    2. 初始化两个链表头,其中一个表头用以记录两个链表比较后的结果,另一个用来返回结果。
    3. 循环,如果两个链表不为空,进行比较,并将值小的赋给合并的链表头cur,值小的链表向后移动一位,合并链表cur向后移动一位。
    4. 如果两个链表有一为空,循环结束,把未结束的链表直接连接到合并链表的尾部。

    思路二(递归):

    1. 首先处理空链表,当其中一个为空链表时,直接输出另一个;当两个均为空链表时,输出null。
    2. 比较 list1 和 list2 的头结点,较小的头结点作为合并后新链表的头结点
    3. 确定新链表的头结点之后,就可以递归比较余下的结点了

    代码实现

    package LinkedList;
    
    /**
     * 合并两个排序的链表
     * 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
     */
    public class Solution39 {
        /**
         * 迭代
         *
         * @param list1
         * @param list2
         * @return
         */
        public ListNode Merge_2(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 cur = head;
            while (list1 != null && list2 != null) {
                if (list1.val < list2.val) {//如果链表1的结点小于链表2的结点
                    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;
        }
    
        /**
         * 递归
         *
         * @param list1
         * @param list2
         * @return
         */
        public ListNode Merge(ListNode list1, ListNode list2) {
            if (list1 == null && list2 == null)
                return null;
            if (list1 == null)
                return list2;
            if (list2 == null)
                return list1;
            if (list1.val <= list2.val) {//如果链表1的结点小于等于链表2的结点
                list1.next = Merge(list1.next, list2);
                return list1;
            } else {
                list2.next = Merge(list1, list2.next);
                return list2;
            }
        }
    
        public class ListNode {
            int val;
            ListNode next = null;
    
            ListNode(int val) {
                this.val = val;
            }
        }
    }
    
    
  • 相关阅读:
    mybatis-generator.xml
    模板下载
    任务导出
    订单导出
    创建指定日期任务
    字符串的知识
    数组元素反转
    JVM 中知识
    Redis介绍
    JsonP
  • 原文地址:https://www.cnblogs.com/wupeixuan/p/8686438.html
Copyright © 2011-2022 走看看