原題java
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. node
題目大意code
合併兩個排序鏈表並返回一個新的列表。新的鏈表的結果由原先的兩個鏈表結點組成,也就是不能合併後的鏈表不能包含新建立的結點。 排序
解題思路遞歸
使用頭結點root進行輔助操做,建立一個頭結點,再使用兩個引用指向兩個鏈表的頭結點,將較小的結點值的結點摘下來接到root鏈表的末尾,同時被摘的鏈頭引用移動到下一個結點,一直操做,到到原先兩個鏈表中有一個爲空,最後再將剩下的結點接到root鏈表的末尾。最後返回root的下一個結點,其就爲新的鏈表頭。 ci
代碼實現get
//總體代碼 import java.util.* ; public class Demo04{ //非遞歸實現 public static ListNode mergeLists(ListNode l1,ListNode l2){ ListNode head = new ListNode(0); ListNode p = head ; while(l1!=null&&l2!=null){ if(l1.val<=l2.val){ p.next = l1 ; l1 = l1.next ; }else { p.next = l2 ; l2 = l2.next ; } p = p.next ; //移動到新的尾結點 } p.next = (l1 != null ? l1 :l2 ) ; return head.next ; } //遞歸實現 public static ListNode mergeRecursive(ListNode l1,ListNode l2){ if(l1==null)return l2 ; if(l2==null)return l1 ; ListNode head = new ListNode(0); if(l1.val < l2.val){ head = l1 ; head.next = mergeRecursive(l1.next,l2) ; }else{ head = l2 ; head.next = mergeRecursive(l1,l2.next) ; } return head ; } public static void main(String args[]){ ListNode l1 = new ListNode(0) ; ListNode l2 = new ListNode(0) ; ListNode p = l1 ; Scanner sin = new Scanner(System.in); int m = sin.nextInt(); int n = sin.nextInt(); for(int i=0;i<m;i++){ int a = sin.nextInt(); p.next = new ListNode(a); p = p.next ; } p = l2 ; for(int i=0;i<n;i++){ int a = sin.nextInt(); p.next = new ListNode(a); p = p.next ; } /* 錯誤代碼:此處移動了l一、l2的指向,致使後續錯誤 for(int i = 0;i<10;i++){ System.out.print(l1.next.val+" "); l1 = l1.next; } System.out.println(); for(int i = 0;i<10;i++){ System.out.print(l2.next.val+" "); l2 = l2.next; } */ ListNode res = mergeRecursive(l1.next,l2.next); print(res); for(int i = 0;i<m+n;i++){ System.out.print(res.val+" "); res = res.next; } System.out.println(); } public static void print(ListNode head){ while(head!=null){ System.out.print(head.val+" "); head = head.next ; } System.out.println(); } } class ListNode{ int val ; ListNode next ; ListNode(int x){ val = x ; next = null ; } }