ARTS leetcode7 Merge Two Sorted Lists

2024-08-22 07:32

本文主要是介绍ARTS leetcode7 Merge Two Sorted Lists,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.Example:Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4

题目意思:合并两个有序链表,形成一个新的链表,合成以后的链表也是有序的。

看到这个题的时候,想起了大学上数据结构的时候,学习链表知识的第一个例子就是合并两个有序链表,当时是c语言写的,两种形式,一种是用递归,一种是不用递归,我这里采用了递归的方法。

思路:
(1)方法的参数是两个listNode对象,判断是否为空,如果全为null,则返回null,结束;
如果l1为null,则返回l2;如果l2为null,则返回l1;
(2)将两个链表的第一个元素做比较,如果l1的第一个节点值小于l2的第一个节点值,那么就把l1赋值给新创建的node对象,
然后node对象的下一个节点就递归调用方法,第一个参数就是l1.next,第二个参数l2
(3)将两个链表的第一个元素做比较,如果l1的第一个节点值大于或等于l2的第一个节点值,那么就把l2赋值给新创建的node对象,
然后node对象的下一个节点就递归调用方法,第一个参数就是l1,第二个参数l2.next

举个例子来说一下,(2)(3)中传参的含义:就用上面的demo来说,1和1相比较,走(3),l2的第一个被赋值到node,然后我们需要做的就是将l2的next然后继续与l1的一个相比较,所以传参就是这个意思。

代码实现(递归形式):

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode node;if(l1 == null && l2 == null){return null;}if(l1 == null){return l2;}if(l2 == null){return l1;}if(l1.val<l2.val){node = l1;node.next = mergeTwoLists(l1.next,l2);}else {node = l2;node.next = mergeTwoLists(l1,l2.next);}return node;}
}
Runtime: 0 ms, faster than 100.00% of Java online submissions for Merge Two Sorted Lists.
Memory Usage: 37 MB, less than 97.90% of Java online submissions for Merge Two Sorted Lists.

code2:非递归的形式,利用循环,代码实现如下:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if(l1 == null && l2 == null){return null;}if(l1 == null){return l2;}if(l2 == null){return l1;}//首先的初始化一个nodeListNode result = new ListNode(0);ListNode node = result;//两个node都不为空的情况下循环while(l1!=null && l2!=null){if(l1.val<l2.val){node.next = l1;l1 = l1.next;}else {node.next = l2;l2 = l2.next;}node = node.next;}//这里主要是为了两个链表长度不一样的时候,所采取的处理方法。if(l1!=null){node.next = l1;}if(l2!=null){node.next = l2;}//因为初始化的时候给链表多一个节点0,所以只需要0以后的节点就okreturn result.next;}
}
Runtime: 1 ms, faster than 99.55% of Java online submissions for Merge Two Sorted Lists.
Memory Usage: 36.8 MB, less than 98.00% of Java online submissions for Merge Two Sorted Lists.

继续看另外一种实现,是在leetcode discuss中看到的一个大佬写的,代码实现很简洁,并没有创建新的ListNode对象,但是他缺了一种考虑,就是如果两个链表都是空的情况下,应该返回null(个人理解)。他也采用了递归的形式进行调用,但是存在一个问题,题目说了需要返回一个new List来存储合并后的list的值,但是这个大佬的写法是改变了原有链表的值,在没有重新创建list的情况下,也实现了,感觉和题目要求有点背离,但是居然也跑成功了。

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if(l1 == null) return l2;if(l2 == null) return l1;if(l1.val < l2.val){l1.next = mergeTwoLists(l1.next, l2);return l1;} else{l2.next = mergeTwoLists(l1, l2.next);return l2;}}
}
Runtime: 0 ms, faster than 100.00% of Java online submissions for Merge Two Sorted Lists.
Memory Usage: 37.1 MB, less than 97.90% of Java online submissions for Merge Two Sorted Lists.

在这里插入图片描述

这篇关于ARTS leetcode7 Merge Two Sorted Lists的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095632

相关文章

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

56. Merge Interval

题目: 解答: 常规的合并,根据前后interval是否有交集判定。 代码: /*** Definition for an interval.* struct Interval {* int start;* int end;* Interval() : start(0), end(0) {}* Interval(int s, int e) : start

Java多线程编程模式实战指南:Two-phase Termination模式

文章来源: http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-termination?utm_source=infoq&utm_campaign=user_page&utm_medium=link 文章代码地址: https://github.com/Visce

多表连接的三种方式hash join,merge join,nested loop

多表之间的连接有三种方式:Nested Loops,Hash Join和 Sort Merge Join. 下面来介绍三种不同连接的不同:     一. NESTED LOOP: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1 万不适合),要把返回

[LeetCode] 583. Delete Operation for Two Strings

题:https://leetcode.com/problems/delete-operation-for-two-strings/description/ 题目 Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in

gitlab 上源码Merge后出现git gc的解决方案

问题: 远程主分支在merger其他分支的请求后,本地主分支pull 远程分支出现git gc * branch master -> FETCH_HEADAuto packing the repository for optimum performance. You may alsorun "git gc" manually. See "git help g

LeetCode - 33. Search in Rotated Sorted Array

33. Search in Rotated Sorted Array  Problem's Link  ---------------------------------------------------------------------------- Mean:  给你一个数组,这个数组是由两个有序的数组拼接成的(无重复元素),在这个数组中查找元素k的下标. anal

CodeForces 425C Sereja and Two Sequences

题意: 两组数字a和b  如果a[i]等于b[j]  则可将a[i]和b[j]前所有数字删掉  这种操作花费e体力  得到1元钱  或者一次删掉所有数字  这种操作花费等于曾经删除的所有数字个数  做完后得到所有钱  问 一共s体力 可以得到多少钱 思路: dp+二分 由数据可知最多拿到300元钱  因此可以定义  dp[i][j]表示有i元钱时  b串删除到了j处时  a串删到的位

SQL SERVER中使用Merge进行批量操作

在.net开发过程中,经常会和数据库打交道。微软的产品包里,SQL SERVER便是一个强大的数据库管理系统(DBS)。我们编写的.net程序怎么和DBS进行交互呢?笔者最常用的便是ado.net组件,其中包括了执行sql命令,执行存储过程等丰富的操作方法。在ERP(企业资源计划)系统中,最常见的场景便是单条数据的增、删、改,或者小批量的DML(数据操纵语言)操作。在这种场景下,应用程序和DBS

poj 1849 Two(树形dp求直径)

树的直径:一棵树中两个点间的最长距离。 Description The city consists of intersections and streets that connect them.  Heavy snow covered the city so the mayor Milan gave to the winter-service a list of streets that ha