• 链表:合并两个有序的链表


     

    题目描述

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

    解题思路

    两种解法:递归和非递归

    这个题目就是归并排序中的归并操作,将两个有序数组(链表)合并为一个有序的数组。

    非递归:

    第一个while循环,将 l1 和 l2 进行比较,谁小谁就合并到 listNode,直到 l1 或者 l2 为空

    第二个while循环和第三个while循环,将 l1 或者 l2 剩下的节点合并到 listNode

    最后返回的是 firstNode.next //头节点是不需要的

    参考代码

    递归:运行时间:27ms  占用内存:9564k

     1 /*
     2 public class ListNode {
     3     int val;
     4     ListNode next = null;
     5 
     6     ListNode(int val) {
     7         this.val = val;
     8     }
     9 }*/
    10 public class Solution {
    11     public ListNode Merge(ListNode list1,ListNode list2) {
    12         if(list1 == null) {
    13             return list2;
    14         }
    15         if(list2 == null) {
    16             return list1;
    17         }
    18         ListNode head = null;
    19         if(list1.val < list2.val) {
    20             head = list1;
    21             head.next = Merge(list1.next, list2);
    22         } else {
    23             head = list2;
    24             head.next = Merge(list1, list2.next);
    25         }
    26         return head;
    27     }
    28 }

    非递归:运行时间:26ms  占用内存:9544k

     1 /*
     2 public class ListNode {
     3     int val;
     4     ListNode next = null;
     5 
     6     ListNode(int val) {
     7         this.val = val;
     8     }
     9 }*/
    10 public class Solution {
    11     public ListNode Merge(ListNode l1, ListNode l2) {
    12         ListNode listNode = new ListNode(0);
    13         ListNode firstNode = listNode;
    14         while (l1 != null && l2 != null) {  //将 l1 和 l2 进行比较,谁小谁就合并到 listNode,直到 l1 或者 l2 为空
    15             if (l1.val <= l2.val) {
    16                 listNode.next = l1;
    17                 l1 = l1.next;
    18             } else {
    19                 listNode.next = l2;
    20                 l2 = l2.next;
    21             }
    22             listNode = listNode.next;
    23         }
    24         while (l1 != null) {        //如果l2空了,就将剩余的l1加入到listNode中
    25             listNode.next = l1;
    26             l1 = l1.next;
    27             listNode = listNode.next;
    28         }
    29         while (l2 != null) {        //如果l1空了,就将剩余的l2加入到listNode中
    30             listNode.next = l2;
    31             l2 = l2.next;
    32             listNode = listNode.next;
    33         }
    34         return firstNode.next;
    35     }
    36 }
  • 相关阅读:
    【动画】看动画轻松理解「Trie树」
    浅析HTTP/2的多路复用
    HTTPS 详解
    PHP写时复制(Copy On Write)
    golang 几种字符串的拼接方式
    正排索引和倒排索引简单介绍
    传值还是传引用
    lvs与nginx区别
    Docker运行操作系统环境(BusyBox&Alpine&Debian/Ubuntu&CentOS/Fedora)
    原创-thanos组件(聚合多个prometheus组件)原理介绍
  • 原文地址:https://www.cnblogs.com/carry6/p/11520868.html
Copyright © 2020-2023  润新知