題目連接:https://leetcode.com/problems/merge-two-sorted-lists/description/java
題目大意:面試
給出兩個升序鏈表,將它們歸併成一個鏈表,如有重複結點,都要連接上去,且新鏈表不新建結點。數組
法一:直接用數組歸併的思想作,碰到一個歸併一個,只是要注意鏈表先後結點之間的操做關係,應該弄清楚java裏面引用之間的關係(此題容易面試當場寫代碼)。代碼以下(耗時14ms):ide
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 class Solution { 10 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { 11 ListNode l = new ListNode(0); 12 ListNode tmp = l; 13 while(l1 != null && l2 != null) { 14 if(l1.val < l2.val) { 15 l.next = l1; 16 l1 = l1.next; 17 // l = l.next; 18 } 19 else if(l1.val > l2.val) { 20 l.next = l2; 21 l2 = l2.next; 22 // l = l.next; 23 } 24 else { 25 l.next = l1; 26 l1 = l1.next; 27 l = l.next; 28 29 l.next = l2; 30 l2 = l2.next; 31 } 32 l = l.next; 33 } 34 if(l1 != null) { 35 l.next = l1; 36 } 37 else if(l2 != null) { 38 l.next = l2; 39 } 40 l = tmp; 41 return l.next; 42 } 43 }
帶有測試代碼:測試
1 package problem_21; 2 3 class ListNode { 4 int val; 5 ListNode next; 6 ListNode(int x) { 7 val = x; 8 } 9 } 10 11 public class MainTest { 12 13 public void addNode(ListNode l, int num) { 14 ListNode listNode = new ListNode(num); 15 listNode.next = null; 16 if(l == null) { 17 l = listNode; 18 return; 19 } 20 ListNode tmp = l; 21 while(tmp.next != null) { 22 tmp = tmp.next; 23 } 24 tmp.next = listNode; 25 } 26 27 public static void main(String[] args) { 28 MainTest t1 = new MainTest(); 29 ListNode l1 = new ListNode(4); 30 t1.addNode(l1, 5); 31 // t1.addNode(l1, 6); 32 ListNode l2 = new ListNode(4); 33 t1.addNode(l2, 6); 34 // t1.addNode(l2, 7); 35 // while(l1 != null) { 36 // System.out.println("1val:" + l1.val); 37 // l1 = l1.next; 38 // } 39 // while(l2 != null) { 40 // System.out.println("2val:" + l2.val); 41 // l2 = l2.next; 42 // } 43 ListNode l = t1.mergeTwoLists(l1, l2); 44 while(l != null) { 45 System.out.println(l.val); 46 l = l.next; 47 } 48 } 49 50 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { 51 ListNode l = new ListNode(0); 52 ListNode tmp = l; 53 while(l1 != null && l2 != null) { 54 if(l1.val < l2.val) { 55 l.next = l1;//這裏在將l1結點賦值給l.next後,不能當即執行l=l1,而只能執行l1=l1.next和l=l.next(這兩個位置能夠調換) 56 //至於爲何,還沒徹底弄明白,應該跟java裏面的對象的引用有關係? 57 // l = l.next; 58 l1 = l1.next; 59 } 60 else if(l1.val > l2.val) { 61 l.next = l2; 62 // l = l.next; 63 l2 = l2.next; 64 } 65 else {//測試用例中有5和5歸併,結果輸出爲5,5,因此這裏要兩次鏈接結點 66 l.next = l1; 67 l = l.next; 68 l1 = l1.next; 69 70 l.next = l2; 71 // l = l.next; 72 l2 = l2.next; 73 } 74 l = l.next; 75 } 76 if(l1 != null) {//因爲不須要新建結點,因此只須要把剩下的鏈表結點接上去便可。 77 l.next = l1; 78 } 79 else if(l2 != null) { 80 l.next = l2; 81 } 82 l = tmp; 83 return l.next; 84 } 85 }
法二:遞歸歸併。代碼以下(耗時11ms):spa
1 public static ListNode mergeTwoLists(ListNode l1, ListNode l2) { 2 if(l1 == null) { 3 return l2; 4 } 5 if(l2 == null) { 6 return l1; 7 } 8 ListNode l = null; 9 if(l1.val < l2.val) { 10 l = l1; 11 l.next = mergeTwoLists(l1.next, l2); 12 } 13 else { 14 l = l2; 15 l.next = mergeTwoLists(l1, l2.next); 16 } 17 return l; 18 }