Java实现两个有序的单项链表的合并

 

无意中看到一道题,如下:

现有两个有序(升序)的单向链表,请编写程序将这两个链表合并成一个,并确保合并后的链表也是升序的
单向升序链表定义:
public class ListNode {
 int val;
 ListNode next;
 ListNode(int x) { val = x; }
}

请在下面的代码框架基础上编写:
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNodel2) {

}

}
 

 
  1. /**

  2. *

  3. * 现有两个有序(升序)的单向链表,请编写程序将这两个链表合并成一个,并确保合并后的链表也是升序的

  4. * @author Henry

  5. * @createDate 2016-10-27

  6. */

  7. public class ListNodeTest {

  8. public static void main(String[] args) {

  9. ListNode l1 = new ListNode(0);

  10. l1.next = new ListNode(2);

  11. l1.next.next = new ListNode(5);

  12. l1.next.next.next = new ListNode(7);

  13.  
  14. ListNode l2 = new ListNode(1);

  15. l2.next = new ListNode(3);

  16. l2.next.next = new ListNode(5);

  17.  
  18. ListNode l = new Solution().mergeTwoLists(l1, l2);

  19. while (l != null) {

  20. System.out.println(l.val);

  21. l = l.next;

  22. }

  23. }

  24. }

  25. /**

  26. * 单向升序链表定义:

  27. * @author Henry

  28. * @createDate 2016-10-27

  29. */

  30. class ListNode {

  31. int val;

  32. ListNode next;

  33.  
  34. ListNode(int x) {

  35. this.val = x;

  36. }

  37. }

  38.  
  39. /**

  40. * 将单项链表进行排序

  41. *

  42. * @author Henry

  43. * @createDate 2016-10-27

  44. */

  45. class Solution {

  46. /**

  47. * 将单项链表进行排序

  48. *

  49. * @author Henry

  50. * @createDate 2016-10-27

  51. * @param l1

  52. * @param l2

  53. * @return

  54. */

  55. public ListNode mergeTwoLists(ListNode l1, ListNode l2) {

  56. ListNode result = null;

  57. result = getResult(result, l1, l2);

  58. return result;

  59. }

  60. /**

  61. * 一开始的时候想写while,但是发现无法获得头结点,并且定义变量较为复杂。

  62. * 回头一想,认为递归可以直接实现队列的排序。所以又重新编写一下逻辑。

  63. * 这样编写节约内存,提升效率。

  64. *

  65. * @param result null

  66. * @param l1 单项链表1 头项

  67. * @param l2 单项链表2 头项

  68. * @return 返回头结点

  69. */

  70. public ListNode getResult(ListNode result, ListNode l1, ListNode l2) {

  71. if (l1 == null && l2 == null) {

  72. return null;

  73. }

  74. if (l1 == null) {

  75. result = l2;

  76. //result.next = getResult(result.next, l1, l2.next);

  77. return result;

  78. }

  79. if (l2 == null) {

  80. result = l1;

  81. //result.next = getResult(result.next, l1.next, l2);

  82. return result;

  83. }

  84. if (l1.val > l2.val) {

  85. result = l2;

  86. l2 = l2.next;

  87. } else {

  88. result = l1;

  89. l1 = l1.next;

  90. }

  91. result.next = getResult(result.next, l1, l2);

  92. return result;

  93. }

  94. }

时隔快一年啦,今天看到HashMap的源码时,想起还有这个没有写。今天写一下,把它补齐,用while的写法实现。自己好以后做参考。

 
  1. /**

  2. * while 将单项链表进行排序

  3. * 如果l1或l2为空,则返回单边。

  4. * @author Henry

  5. * @date 2017-7-10

  6. * @param l1

  7. * @param l2

  8. * @return

  9. */

  10. public ListNode mergeTwoLists2(ListNode l1, ListNode l2) {

  11. if (l1 == null || l2 == null) {

  12. return l1 != null ? l1 : l2;

  13. }

  14. ListNode head = l1.val < l2.val ? l1 : l2;

  15. ListNode other = l1.val >= l2.val ? l1 : l2;

  16. ListNode prevHead = head;

  17. ListNode prevOther = other;

  18. while (prevHead != null) {

  19. ListNode next = prevHead.next;

  20. if (next != null && next.val > prevOther.val) {

  21. prevHead.next = prevOther;

  22. prevOther = next;

  23. }

  24. if(prevHead.next==null){

  25. prevHead.next=prevOther;

  26. break;

  27. }

  28. prevHead=prevHead.next;

  29. }

  30. return head;

  31. }

猜你喜欢

转载自blog.csdn.net/qq_38384440/article/details/81750778