關於合併有序陣列/連結串列的總結
阿新 • • 發佈:2019-01-26
通過最近的研究,發現好多公司在筆試和麵試中還是挺喜歡讓你寫一些合併類的程式。主要有合併兩個有序陣列和合並兩個有序單鏈表(可擴充套件考慮如何合併K個有序連結串列),本部落格中,對合並有序陣列和合並有序連結串列做了一個總結,以便自己接下來的翻閱,也為了給小夥伴分享。
1、合併兩個有序的陣列
演算法步驟如下:
- 建立一個可以容納兩個有序陣列的新陣列
- 通過對陣列1和陣列2中每位進行比較,存入新陣列中
- 當某一個數組較短,比較結束後,將較長陣列中剩餘的元素都加入新陣列中
程式碼如下:
package cn.ywq.test; public class Client { public static void main(String[] args) { int[] a = { 1, 3, 5, 7, 12, 14, 23, 45, 46, 67, 89, 100 }; int[] b = { 2, 4, 6, 8, 9, 68 }; int[] result = Merge(a, b); for (int i : result) { System.out.println(i); } } private static int[] Merge(int a[], int b[]) { int result[] = new int[a.length + b.length]; int i = 0, j = 0, k = 0; // i:用於標示a陣列 j:用來標示b陣列 k:用來標示傳入的陣列 while (i < a.length && j < b.length) { if (a[i] <= b[j]) { result[k++] = a[i++]; // 這種用法 很厲害 } else { result[k++] = b[j++]; // 這種用法 很厲害 } } // 下邊的兩個迴圈是將長的陣列剩下的部分存入result陣列中 while (i < a.length) result[k++] = a[i++]; while (j < b.length) result[k++] = b[j++]; return result; } }
2、合併兩個有序的單鏈表
步驟如下:
- 建立連結串列的結構
- 建立兩個有序的單鏈表
- 呼叫合併方法進行合併操作
在合併方法中,通過對連結串列data域的比較和指標的移動,使用遞迴的方法來完成合並操作。
程式碼如下:
package com.ywq.test2; import org.junit.Test; public class Solution2 { @Test public void test() { //建立有序連結串列list1 0-2-5-7-9 ListNode list1 = new ListNode(0); list1.next = new ListNode(2); list1.next.next = new ListNode(5); list1.next.next.next = new ListNode(7); list1.next.next.next.next = new ListNode(9); //建立有序連結串列list2 1-3-6-8 ListNode list2 = new ListNode(1); list2.next = new ListNode(3); list2.next.next = new ListNode(6); list2.next.next.next = new ListNode(8); //呼叫合併方法 ListNode list3 = mergeKLists(list1, list2); //將結果輸出 while (list3 != null) { System.out.println(list3.val); list3 = list3.next; } } public ListNode mergeKLists(ListNode list1, ListNode list2) { ListNode result=null; if (list1 == null && list2 == null) { return null; } if (list1 == null) { result = list2; return result; } if (list2 == null) { result = list1; return result; } if (list1.val > list2.val) { result = list2; list2 = list2.next; } else { result = list1; list1 = list1.next; } result.next = mergeKLists(list1, list2); return result; } } class ListNode { public int val; public ListNode next; public ListNode(int val) { this.val = val; this.next = null; } }
如果對你有幫助,記得點贊哦~歡迎大家關注我的部落格,可以進群366533258一起交流學習哦~