牛客網線上程式設計專題《劍指offer-面試題17》合併兩個排序的連結串列
阿新 • • 發佈:2018-12-13
題目連結:
題目描述:
解題思路:
(1)方法一:
修改兩個待合併連結串列的引用域,使它們稱為一個有序的連結串列list3。具體思路如下圖所示:
已經AC的程式碼:
public class MergeLinkedList { // 定義結點 public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } // 建立連結串列 public ListNode currentNode = null; ListNode head_cre = null; public ListNode createList(int val) { if(head_cre == null) { head_cre = new ListNode(val); currentNode = head_cre; }else { ListNode temp = new ListNode(val); currentNode.next = temp; currentNode = temp; } return head_cre; } // 合併兩個有序連結串列 public ListNode Merge(ListNode list1,ListNode list2) { ListNode pa = list1; ListNode pb = list2; ListNode pc = null; ListNode list3 = null; if(list1 == null) return list2; if(list2 == null) return list1; while(pa != null && pb != null) { if(pa.val <= pb.val) { if(pc == null) { pc = pa; list3 = pc; } else { pc.next = pa; pc = pa; } pa = pa.next; }else { if (pc == null) { pc = pb; list3 = pc; } else { pc.next = pb; pc = pb; } pb = pb.next; } } if(pa == null) { pc.next = pb; }else { pc.next = pa; } return list3; } //方法:遍歷連結串列(列印輸出連結串列。方法的引數表示從節點node開始進行遍歷 ListNode current = null; public void print(ListNode node) { if (node == null) { return; } current = node; while (current != null) { System.out.println(current.val); current = current.next; } } public static void main(String[] args) { // TODO Auto-generated method stub MergeLinkedList mg = new MergeLinkedList(); ListNode list1 = null; ListNode list2 = null; ListNode list3 = null; // 測試用例 for(int i=1; i<=5; i+=2) { list1 = mg.createList(i); } mg.head_cre = null; mg.currentNode = null; for(int i=2; i<=6; i+=2) { list2 = mg.createList(i); } // 合併兩個有序連結串列 list3 = mg.Merge(list1, list2); //打印出合併後的新連結串列 mg.print(list3); } }
(2)方法二:遞迴法
public ListNode Merge(ListNode list1,ListNode list2) { ListNode pc = null; if(list1 == null) { return list2; }else if(list2 == null) { return list1; } if(list1.val <= list2.val) { pc = list1; pc.next = Merge(list1.next, list2); }else { pc = list2; pc.next = Merge(list1, list2.next); } return pc; }