日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

21. Merge Two Sorted Lists

發布時間:2025/4/16 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 21. Merge Two Sorted Lists 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目來自于leetcode,要求是將兩個已經有序的鏈表拼接成一個有序的鏈表,鏈表結構如下:

public class ListNode{int val;ListNode next;ListNode(int x){val=x;}}

示意圖如下,一個長方形成為節點,一個鏈表至少有一個節點。

方法一:首先創建一個新的鏈表L,比較了L1和L2當前結點的Val,小的加入到L中,同時將節點向后移,

    直到有一個鏈表為空。最后將另一個非空的鏈表添加到L即可。時間復雜度為O(n+m).

    Header:新鏈表的頭節點,pre作為當前鏈表的最后一個節點,具體步驟如下:

    1.判斷L1和L2其中一個是否為空,若有為空,執行3,否則執行2

    2.比較L1和L2的Val值,小的添加到pre節點的后面,并向右移動一個節點(ListNode=ListNode.next,注意此時鏈表ListNode已經發生改變了),

    同時pre指向Header鏈表的最后一個。執行1.

    3.若L1不為空,則將L1添加到pre的后面。若L2不為空則將L2添加到pre節點的后面。

    具體實現代碼如下:

public ListNode mergeTwoLists(ListNode l1, ListNode l2){ListNode header=new ListNode(0);ListNode pre=header;while(l1!=null&&l2!=null){if(l1.val>l2.val){pre.next=l2;l2=l2.next;}else{pre.next=l1;l1=l1.next;}pre=pre.next;}if(l2!=null){pre.next=l2;}if(l1!=null){pre.next=l1;}return header.next;}

方法二:由于L1和L2已經是有序了,所以可以考慮將L2插入到L1中,這里只講插入操作怎么進行,具體過程看java代碼

    

    Header 任然為頭結點,pre為當前節點的末節點,,紅線代表需要修改的指向,綠線代表需要刪除的指向

,現在考慮L2的Val比L1小的情況,

    插入步驟如下:

    1。保留L2下一個節點為next

    2.修改L2下一個節點的指向為pre指向的下個節點

    3.修改pre指向的節點為L2

    4.將pre和L2各自向右移動一個節點

    具體代碼如下:

public ListNode mergeTwoLists(ListNode l1, ListNode l2){ListNode helper=new ListNode(0);ListNode pre=helper;helper.next=l1;while(l1!=null&&l2!=null){if(l1.val>l2.val){ListNode next=l2.next;l2.next=pre.next;pre.next=l2;l2=next;}else{l1=l1.next;}pre=pre.next;}if(l2!=null){pre.next=l2;}return helper.next;}

 方法3:采用遞歸的思想,若將函數看成求兩個鏈表當前較小的節點,遞歸結束為兩個鏈表中有一個為null。

    步驟一:1.創建一個節點header為L1和L2較小的節點

        2.創建一個中間變量nonheader為L1和L2較大的節點

·       ? 3.將header下個節點指向遞歸函數的返回結果,但此時傳參中header已經向右移動了一個單位

   

  代碼如下:

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if(l1==null) return l1;if(l2==null) return l2;ListNode head=(l1.val<l2.val)?l1:l2;ListNode nonhead=(l1.val<l2.val)?l2:l1;head.next=mergeTwoLists(head.next,nonhead);return head;}

這三種方法都可以實現,總體效果最好的時遞歸的方法。如有紕漏,希望能得到大家的幫助。

轉載于:https://www.cnblogs.com/bufferflies/p/7644347.html

總結

以上是生活随笔為你收集整理的21. Merge Two Sorted Lists的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。