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

我写的:

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

    https://blog.csdn.net/zakerhero/article/details/107714801

  2. banner的使用

    Android中banner的使用步骤 Step 1.依赖banner Gradle dependencies{ compile 'com.youth.banner:banner:1.4.9' //最 ...

  3. viewpager加fragment可滑动加radio跟随滑动

    public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, V ...

  4. 运用python中装饰器方法来解决工作中为原有代码添加功能问题

          Python  装饰器 在实际的工作中,经常碰到领导或产品经理会提出很多甚至(变态)的产品要求,作为python开发,好不容易完成领导的需求,做出一个产品,并且经过测试成功上线.突然有一天 ...

  5. C语言学习--练习--合并两个字符串

    将两个字符串合并追加在一起, 类似于python的str1+str2 #include<stdio.h> #include<string.h> #include<stdl ...

  6. httpcanary高级版--不闪退!!!!

    地址 https://wwm.lanzouw.com/iOf7Hz11s4j 密码:45of

  7. el-input 限制输入框只能输入数字和小数

    方法一: oninput ="value=value.replace(/[^\d]/g,'')" //只能输入数字 oninput ="value=value.repla ...

  8. Mysql数据库基础第三章:DML语言

    Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...

  9. 02 Spark架构与运行流程

    1. 为什么要引入Yarn和Spark. YARN优势1.YARN的设计减小了JobTracker的资源消耗,并且让监测每一个Job子任务(tasks)状态的程序分布式化了,更安全.更优美. 2.在新 ...

  10. picture --攻防世界

    题目描述: 下载得到附件 解题思路: (1)将图片放入winnhex中查看 发现这是一张jpeg图片,修改文件后缀尾.jpg 或者使用binwalk分析 (2)binwalk分离图片 foremost ...