• leetcode21合并两个有序链表


    题目:

    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

    示例 1:

    输入:l1 = [1,2,4], l2 = [1,3,4]
    输出:[1,1,2,3,4,4]
    

    示例 2:

    输入:l1 = [], l2 = []
    输出:[]
    

    示例 3:

    输入:l1 = [], l2 = [0]
    输出:[0]
    

    提示:

    • 两个链表的节点数目范围是 [0, 50]
    • -100 <= Node.val <= 100
    • l1 和 l2 均按 非递减顺序 排列

    解决:

    解法1:循环+双指针

    用示例一来演示,引入结果节点P,对l1和l2的头节点进行比较,1=1,优先把l2的节点挂到结果中,l2指针后移。再比较l1的1和l2的3,1<3,则把l1的节点挂到结果中,l1指针后移。2<3,则把l1的2挂到结果中,l1指针后移。4>3,则把l2的3挂到结果中,l2指针后移。4=4,把l2的节点挂到结果中,l2指针后移,这时候l2的指针已经到末尾了,已经null了,则把l1的剩下的链表节点都挂到结果链表中,这样就得到了合并的链表。

    用红色来表示l1的节点,则新链表为:1->1->2->3->4->4

    时间复杂度为O(m+n).因为两个链表都要遍历一遍,m和n分别为链表的元素个数。

    空间复杂度为O(1).

    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. public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    13. if(list1==null)//边界情况
    14. return list2;
    15. if(list2==null)//边界情况
    16. return list1;
    17. ListNode resultNode=new ListNode(0);
    18. ListNode p=resultNode;//结果节点
    19. while(list1!=null&&list2!=null){//比较
    20. if(list1.val//l1节点的值小则把l1节点挂结果中
    21. p.next=list1;
    22. list1=list1.next;
    23. }else{
    24. p.next=list2;
    25. list2=list2.next;
    26. }
    27. p=p.next;
    28. }
    29. if(list1!=null){//其中一个链表指针遍历到末尾之后看哪个链表还没遍历完,若是l1没遍历完则把l1剩下的挂在结果中
    30. p.next=list1;
    31. }
    32. if(list2!=null){
    33. p.next=list2;//把l2没遍历完的挂在结果中
    34. }
    35. return resultNode.next;
    36. }
    37. }

    在IDEA上运行用的完整代码:

    1. class ListNode{
    2. int val;
    3. ListNode next;
    4. ListNode(int val){
    5. this.val=val;
    6. }
    7. public void add(int newval){
    8. ListNode newNode=new ListNode(newval);
    9. if(this.next==null){
    10. this.next=newNode;
    11. }
    12. else
    13. this.next.add(newval);
    14. }
    15. public void print(){
    16. System.out.print(this.val);
    17. if(this.next!=null)
    18. {
    19. System.out.print("->");
    20. this.next.print();
    21. }
    22. }
    23. }
    24. public class leetcode5 {
    25. /*循环+双指针解决*/
    26. static ListNode mergeTwoLists(ListNode l1,ListNode l2){
    27. if(l1==null)
    28. return l2;
    29. if(l2==null)
    30. return l1;
    31. ListNode resultNode=new ListNode(0);
    32. ListNode p=resultNode;
    33. while(l1!=null&&l2!=null){
    34. if(l1.val
    35. p.next=l1;
    36. l1=l1.next;
    37. }else{
    38. p.next=l2;
    39. l2=l2.next;
    40. }
    41. p=p.next;
    42. }
    43. if(l1!=null){
    44. p.next=l1;
    45. }
    46. if(l2!=null){
    47. p.next=l2;
    48. }
    49. return resultNode.next;
    50. }
    51. public static void main(String[] args) {
    52. ListNode l1=new ListNode(1);
    53. l1.add(2);
    54. l1.add(4);
    55. l1.print();
    56. System.out.println();
    57. ListNode l2=new ListNode(1);
    58. l2.add(3);
    59. l2.add(4);
    60. l2.print();
    61. System.out.println();
    62. mergeTwoLists(l1,l2).print();
    63. System.out.println();
    64. System.out.println("hello list");
    65. /*
    66. 1->2->4
    67. 1->3->4
    68. 1->1->2->3->4->4
    69. hello list
    70. */
    71. }
    72. }

    解法2:递归

    还是以示例一来演示,本来l1是1->2->4。l2是1->3->4。就是这两个链表要合并。然后如果把l2的1合并到l1之后就相当于是新l1:1->1->2->4和l2:3->4要合并。所以可以用递归来解决。

    时间复杂度为O(m+n)

    空间复杂度为O(m+n)

    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. public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    13. if(list1==null)
    14. return list2;
    15. if(list2==null)
    16. return list1;
    17. if(list1.val
    18. list1.next=mergeTwoLists(list1.next,list2);
    19. return list1;
    20. }
    21. list2.next=mergeTwoLists(list1,list2.next);
    22. return list2;
    23. }
    24. }

    在IDEA上运行用的完整代码:

    1. class ListNode{
    2. int val;
    3. ListNode next;
    4. ListNode(int val){
    5. this.val=val;
    6. }
    7. public void add(int newval){
    8. ListNode newNode=new ListNode(newval);
    9. if(this.next==null){
    10. this.next=newNode;
    11. }
    12. else
    13. this.next.add(newval);
    14. }
    15. public void print(){
    16. System.out.print(this.val);
    17. if(this.next!=null)
    18. {
    19. System.out.print("->");
    20. this.next.print();
    21. }
    22. }
    23. }
    24. public class leetcode5 {
    25. /*递归解决*/
    26. static ListNode mergeTwoLists2(ListNode l1,ListNode l2){
    27. if(l1==null)
    28. return l2;
    29. if(l2==null)
    30. return l1;
    31. if(l1.val
    32. l1.next=mergeTwoLists2(l1.next,l2);
    33. return l1;
    34. }
    35. l2.next=mergeTwoLists2(l1,l2.next);
    36. System.out.print("->");
    37. System.out.print(l2.val);
    38. return l2;
    39. }
    40. public static void main(String[] args) {
    41. ListNode l1=new ListNode(1);
    42. l1.add(2);
    43. l1.add(4);
    44. l1.print();
    45. System.out.println();
    46. ListNode l2=new ListNode(1);
    47. l2.add(3);
    48. l2.add(4);
    49. l2.print();
    50. System.out.println();
    51. System.out.println("hello list");
    52. System.out.println("下面的链表要倒着看");
    53. mergeTwoLists2(l1,l2);
    54. /*
    55. 1->2->4
    56. 1->3->4
    57. hello list
    58. 下面的链表要倒着看
    59. ->4->4->3->2->1->1
    60. */
    61. }
    62. }

    加油加油^_^

  • 相关阅读:
    参考线平滑-QpSplineReferenceLineSmoother
    Linux设置密码复杂度
    软件工程中如何设计测试用例
    HTML(15)——盒子模型
    Positive Technologies:无论是大型公司还是中小型企业,每个人都需要网络安全自动控制系统。
    做跨境电商一定要学会用PRA软件,解放双手提高效率!
    星辰大海:孙宇晨的DAO将重新定义新商业航天时代
    定性检测的样本量估算之精确概率法
    跨域?同源?一次搞懂什么是跨域
    17 结构型模式-享元模式
  • 原文地址:https://blog.csdn.net/nameofworld/article/details/132943554