想法:
1.迭代
设两个指针pa和pb,不断移动pa和pb,并进行比较,则将较小元素接到新链表,该过程直至pa或pb为null,之后将未空的接到已空之后,得到升序链表
 
 1 //官方:
2 class Solution {
3 public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
4 ListNode prehead = new ListNode(-1);
5
6
7 ListNode prev = prehead;
8 while (l1 != null && l2 != null) {
9 if (l1.val <= l2.val) {
10 prev.next = l1;
11 l1 = l1.next;
12 } else {
13 prev.next = l2;
14 l2 = l2.next;
15 }
16 prev = prev.next;
17 }
18
19
20 // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
21 prev.next = l1 == null ? l2 : l1;
22
23
24 return prehead.next;
25 }
26 }
27
28
29 作者:LeetCode-Solution
30 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/
31 来源:力扣(LeetCode)
32 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我写的:

 1 /**
2 * Definition for singly-linked list.
3 * public class ListNode {
4 * int val;
5 * ListNode next;
6 * ListNode() {}
7 * ListNode(int val) { this.val = val; }
8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
9 * }
10 */
11 class Solution {
12
13 public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
14 ListNode start = new ListNode(-1);
15 ListNode q = start;
16 if(list1==null || list2==null){//输入为空时
17 if(list1==null){
18 return list2;
19 }else{
20 return list1;
21 }
22 }
23
24 //设两个指针pa和pb,不断移动pa和pb,并进行比较,则将较小元素接到新链表,该过程直至pa或pb为null
25 while(list1!=null && list2!=null){
26 if(!(list1.val>list2.val)){
27 //list1<=list2
28 q.next = list1;
29 list1 = list1.next;
30 }else{//list1>list2
31 q.next = list2;
32 list2 = list2.next;
33 }
34 q = q.next;
35 }
36
37 //之后将未空的接到新链表之后,得到完整升序链表
38 q.next = list1 == null ? list2 : list1;
39 return start.next;
40 }
41 }
2.递归(官方另解)
 
我们直接将以上递归过程建模,同时需要考虑边界情况。
 
如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。
 
 
 1 class Solution {
2 public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
3 if (l1 == null) {
4 return l2;
5 } else if (l2 == null) {
6 return l1;
7 } else if (l1.val < l2.val) {
8 l1.next = mergeTwoLists(l1.next, l2);
9 return l1;
10 } else {
11 l2.next = mergeTwoLists(l1, l2.next);
12 return l2;
13 }
14 }
15 }
16
17
18 作者:LeetCode-Solution
19 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu/
20 来源:力扣(LeetCode)
21 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Leecode 21.合并两个有序链表(Java 迭代、递归两种方法)的更多相关文章

  1. 合并两个有序链表(java实现)

    题目: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-&g ...

  2. LeetCode--021--合并两个有序链表(java)

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...

  3. 剑指offer-反向遍历链表-栈和递归2种方法(一次性跑通)

  4. 斐波那契数列-java编程:三种方法实现斐波那契数列

    题目要求:编写程序在控制台输出斐波那契数列前20项,每输出5个数换行 斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 这个数列 ...

  5. Java实现 LeetCode 21 合并两个有序链表

    21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1 ...

  6. LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)

    21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode ...

  7. [LeetCode] 21. 合并两个有序链表

    题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/ 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定 ...

  8. Leecode刷题之旅-C语言/python-21.合并两个有序链表

    /* * @lc app=leetcode.cn id=21 lang=c * * [21] 合并两个有序链表 * * https://leetcode-cn.com/problems/merge-t ...

  9. [LC]21题 Merge Two Sorted Lists (合并两个有序链表)(链表)

    ①英文题目 Merge two sorted linked lists and return it as a new list. The new list should be made by spli ...

  10. LeetCode 21:合并两个有序链表 Merge Two Sorted Lists

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. Merge two sorted linked lists and return it as a new ...

随机推荐

  1. 【快速学】C/C++编译器

    编译器 谁维护 平台 版权 Visual C++ Microsoft https://visualstudio.microsoft.com/ Microsoft Windows 有免费版 GCC C ...

  2. golang常见编程错误集

    一.append是深拷贝, func main() { a := []int{7, 8, 9} fmt.Printf("%+v\n", a) ap(a) fmt.Println(& ...

  3. 【python学习】数据结构第一节

    1.访问元组或列表中的值      (注:元素是从0开始从左往有编号的,或者从右向左编号[-1开始]) 列表 x1 = [1,2,3,4] 元组 x2 =(1,2,3,4) print(x2[0]) ...

  4. javaSE-验证码生成

    一.使用Math类的radom() 方法 //生成验证码 String verifcationCode = ""; for (int i = 0; i <= 5; i++) ...

  5. virtualenv管理py环境linux版

    因为服务器上已经安装了python3,所以直接安装virtualenv即可 pip3 install virtualenv -i https://mirrors.aliyun.com/pypi/sim ...

  6. Mac怎么安装Andriod模拟器

    Mac上怎么安装 Andriod 系统模拟器?有的朋友可能需要在自己用的 Mac 电脑上安装Andriod 系统模拟器,用于开发或测试一些安卓软件.介绍下怎么在 Mac 上用 Parallels De ...

  7. 7.golang语言学习,标识符的命名规范

    1.凡是自己可以命名的都是标识符 2.命名规则 a.由26个英文字母,数字0-9,_组成 b.不能数字开头 c.严格区分大小写 d.不能包含空格 e.下划线"_"本身在go中是一个 ...

  8. idea引入ojdbc包报错

    网上下载或者让同事传两个jar过来,ojdbc6-11.2.0.7.0.jar 以及jconn3.0.jar 放入同一个文件夹中: 在此文件夹中cmd如下:回车,进入cmd控制台. 输入如下两个命令: ...

  9. JS篇(007)-事件委托是什么

    答案:利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行! 解析: 1.那什么样的事件可以用事件委托,什么样的事件不可以用呢? 适合用事件委托的事件:click,mousedown,mou ...

  10. c二级

    一·基本数据结构与算法 算法基本概念 算法:解决问题的方法 程序:用某种语言来诠释算法,将算法写成代码. 算法基本特征: 1.可行性 2.确定性 3.有穷性 4.有足够的情报 算法的基本要素 1.算法 ...