合併兩個有序鏈表
題目描述:
將兩個升序鏈表合併爲一個新的 升序 鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
分析:因爲兩個鏈表爲有序鏈表,因此可以對兩個鏈表同時進行遍歷,並且將兩個鏈表的元素值進行對比,如果鏈表1的值比當前鏈表2 的值小,則將鏈表1向後移動一個元素,鏈表2不動,再次進行比較。若鏈表2的值比鏈表1的小,將鏈表2的當前節點插入到鏈表1中,同時將鏈表2的元素指針向後移動一個。反之亦然。
具體代碼如下:
因爲在JAVA中,並無鏈表類ListNode類,所以需要自己實現鏈表ListNode類的封裝。代碼如下:
在這裏插入代碼片
class ListNode {
int val;
ListNode next;
public ListNode(int x){
this.val=x;
next=null;
}
}
在封裝完鏈表類之後,就可以創建鏈表來完成鏈表的合併了,此次解題使用的遞歸方式。具體代碼如下:
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
if(l1.val<l2.val){
l1.next=mergeTwoLists(l1.next, l2);
return l1;
}else{
l2.next=mergeTwoLists(l1, l2.next);
return l2;
}
}
public static void main(String[] args) {
ListNode l1=new ListNode(1);//創建鏈表l1頭節點
ListNode l1Head=l1; //防止鏈表l1的表頭丟失
ListNode l2=new ListNode(1); //創建鏈表l2頭節點
ListNode l2Head=l2; //防止鏈表l2的表頭丟失
for(int i=0;i<5;i++){ //循環創建5個節點加入到鏈表l1中
ListNode temp=new ListNode(i+3);
l1.next=temp;
l1=l1.next;
}
for(int i=3;i<8;i++){//循環創建5個節點加入到鏈表l2中
ListNode temp=new ListNode(i+1);
l2.next=temp;
l2=l2.next;
}
Solution su=new Solution();
ListNode l3=su.mergeTwoLists(l1Head, l2Head);
ListNode l3Head=l3; //防止鏈表l3的表頭丟失
while(l3!=null){//輸出合併完成的鏈表
System.out.println(l3.val);
l3=l3.next;
}
}
}