21.Merge Two Sorted Lists---《劍指offer》面試17

題目連接: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 }
View Code

 帶有測試代碼:測試

 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 }
View Code

 法二:遞歸歸併。代碼以下(耗時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     }
View Code
相關文章
相關標籤/搜索