1. 程式人生 > >劍指Offer 合並兩個排序的鏈表

劍指Offer 合並兩個排序的鏈表

合成 rank st2 listnode 代碼 .cn style inter 有一個

  題目描述:輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。

  題目鏈接:合並兩個排序的鏈表

  思路:類似於2路歸並排序的合並操作,先取兩個鏈表首結點值小者作為新鏈表的首結點,然後遍歷兩個鏈表,取小者作為其後繼結點,直到至少有一個鏈表為空,最後把至多一個非空鏈表首結點作為其後繼結點。2路歸並排序的具體內容可以看數據結構 歸並排序這篇博客。

  步驟:

  1 如果一個鏈表為空,則返回另一個鏈表。

  2 取兩個鏈表首結點值小者作為新鏈表的首結點。

  3 遍歷兩個鏈表,取小者作為其後繼結點,直到至少有一個鏈表為空。

  4 把至多一個非空鏈表首結點作為其後繼結點。

  5 返回新鏈表的首結點。

  時間復雜度:O(len1+len2)。

  Java代碼:

 1 /*
 2 public class ListNode {
 3     int val;
 4     ListNode next = null;
 5 
 6     ListNode(int val) {
 7         this.val = val;
 8     }
 9 }*/
10 public class Solution {
11     // 非遞歸,類似於歸並排序
12     public ListNode Merge(ListNode list1, ListNode list2) {
13 // 如果至少有一個鏈表為空 14 if (list1 == null) { 15 return list2; 16 } 17 if (list2 == null) { 18 return list1; 19 } 20 21 // 確定首結點 22 ListNode head = null; 23 if (list1.val <= list2.val) { 24 head = list1;
25 list1 = list1.next; 26 } else { 27 head = list2; 28 list2 = list2.next; 29 } 30 31 ListNode cur = head; 32 while (list1 != null && list2 != null) { 33 ListNode min = null; 34 if (list1.val <= list2.val) { 35 min = list1; 36 list1 = list1.next; 37 } else { 38 min = list2; 39 list2 = list2.next; 40 } 41 42 cur.next = min; 43 cur = min; 44 } 45 46 // 處理剩余結點 47 if (list1 != null) { 48 cur.next = list1; 49 } else { 50 cur.next = list2; 51 } 52 53 return head; 54 } 55 }

劍指Offer 合並兩個排序的鏈表