LeetCode第五題

合併兩個有序鏈表

題目描述:

將兩個升序鏈表合併爲一個新的 升序 鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。

示例:

輸入: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;
    }
    
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章