1. 程式人生 > >Java實現兩個有序的單項鍊表的合併

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. }