当前位置:   article > 正文

[剑指Offer] 合并两个排序的链表(Java)_两个排序链表整合 java

两个排序链表整合 java

题目

合并两个排序的链表-- newcoder 剑指Offer 16
 

题目描述


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

 

思路

1、新建一个结点作为新链表头部的前一个元素

2、逐步遍历两个链表,加入小的元素为新链表的下一个节点

3、新链表最后一个元素指向剩余的链表

 

代码

  1. package com.my.test.codinginterviews.list;
  2. /*
  3. * 题目:
  4. * 合并两个排序的链表-- newcoder 剑指Offer 16
  5. *
  6. * 题目描述:
  7. * 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
  8. */
  9. public class MergeList
  10. {
  11. static class ListNode{
  12. private int val;
  13. private ListNode next;
  14. public ListNode (int value) {
  15. this.val = value;
  16. }
  17. @Override
  18. public String toString() {
  19. if (this.next == null) {
  20. return String.valueOf(this.val);
  21. }
  22. return this.val + "->" + this.next.toString();
  23. }
  24. }
  25. /**
  26. * 思路:
  27. * 比较两链表的头结点,小的为新链表的头结点,分别遍历两个链表的下一个节点,小的作为新链表的下一个节点
  28. */
  29. public static ListNode mergeList(ListNode list1, ListNode list2) {
  30. if (list1 == null && list2 == null) {
  31. return null;
  32. }
  33. if (list2 == null) {
  34. return list1;
  35. }
  36. if (list1 == null) {
  37. return list2;
  38. }
  39. // 新链表头结点
  40. ListNode newHead;
  41. // 两个链表的指针
  42. ListNode curNode1 = list1;
  43. ListNode curNode2 = list2;
  44. // 两个链表中头结点小的为新链表的头结点
  45. if (list1.val <= list2.val) {
  46. newHead = list1;
  47. curNode1 = list1.next;
  48. }
  49. else {
  50. newHead = list2;
  51. curNode2 = list2.next;
  52. }
  53. ListNode tail = newHead;
  54. // 遍历两个链表
  55. while (curNode1 != null && curNode2 != null) {
  56. if (curNode1.val <= curNode2.val) {
  57. tail.next = curNode1;
  58. curNode1 = curNode1.next;
  59. }
  60. else {
  61. tail.next = curNode2;
  62. curNode2 = curNode2.next;
  63. }
  64. // 更新新链表指针
  65. tail = tail.next;
  66. }
  67. // 加上余下的后续链表
  68. if (curNode1 != null) {
  69. tail.next = curNode1;
  70. }
  71. if (curNode2 != null) {
  72. tail.next = curNode2;
  73. }
  74. return newHead;
  75. }
  76. /*
  77. * 思路:
  78. * 1、更加简洁的方法,使用pre节点,虚拟新链表头节点的前一个元素
  79. * 2、比较两链表的头结点,小的为新链表的头结点,分别遍历两个链表的下一个节点,小的作为新链表的下一个节点
  80. */
  81. public ListNode mergeListII(ListNode list1, ListNode list2) {
  82. if (list1 == null && list2 == null) {
  83. return null;
  84. }
  85. if (list1 == null) {
  86. return list2;
  87. }
  88. if (list2 == null) {
  89. return list1;
  90. }
  91. ListNode pre = new ListNode(0);
  92. ListNode cur = pre;
  93. while (list1 != null && list2 != null) {
  94. if (list1.val <= list2.val) {
  95. cur.next = list1;
  96. list1 = list1.next;
  97. } else {
  98. cur.next = list2;
  99. list2 = list2.next;
  100. }
  101. cur = cur.next;
  102. }
  103. if (list1 != null) {
  104. cur.next = list1;
  105. }
  106. if (list2 != null) {
  107. cur.next = list2;
  108. }
  109. return pre.next;
  110. }
  111. public static void main(String args[]) {
  112. // 原链表
  113. ListNode head1 = createTestLinkedList(8);
  114. System.out.println("Origin link1: " + head1);
  115. ListNode head2 = createTestLinkedList(9);
  116. System.out.println("Origin link2: " + head2);
  117. // 合并两个有序链表
  118. System.out.println("Merged link: " + mergeList(head1, head2));
  119. }
  120. private static ListNode createTestLinkedList(int len) {
  121. ListNode head = new ListNode(0);
  122. ListNode curNode = head;
  123. for (int i = 1; i < len; i++) {
  124. curNode.next = new ListNode(i);
  125. curNode = curNode.next;
  126. }
  127. return head;
  128. }
  129. }

 

参考:

链表常见题目:https://www.cnblogs.com/qianguyihao/p/4782595.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/程序诗人/article/detail/62917?site
推荐阅读
相关标签
  

闽ICP备14008679号