劍指Offer 合並兩個排序的鏈表
阿新 • • 發佈:2018-02-14
合成 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 合並兩個排序的鏈表