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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Leetcode 147.对链表进行排序

發(fā)布時間:2024/4/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode 147.对链表进行排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對鏈表進行插入排序

對鏈表進行插入排序。

插入排序算法:

  • 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
  • 每次迭代中,插入排序只從輸入數(shù)據(jù)中移除一個待排序的元素,找到它在序列中適當?shù)奈恢?#xff0c;并將其插入。
  • 重復(fù)直到所有輸入數(shù)據(jù)插入完為止。
  • ? ?

    示例 1:

    輸入: 4->2->1->3

    輸出: 1->2->3->4

    ?

    到了鏈表,我們發(fā)現(xiàn)一個問題,那就是鏈表不能從后往前遍歷,這就很尷尬了。我本來是嘗試找到一個需要移動的節(jié)點(即該節(jié)點的值比前驅(qū)節(jié)點的值小),從前往后遍歷,直到找到一個節(jié)點值比它大時插入到這個節(jié)點前面,然而實現(xiàn)了很久發(fā)現(xiàn)代碼又臭又長,關(guān)鍵是還總有測試用例不通過,最后還是放棄了。

    看了答案發(fā)現(xiàn)思路應(yīng)該是創(chuàng)建一個輔助的新鏈表,并且使用一個指針遍歷原鏈表,每次將原鏈表中的一個節(jié)點插入到新鏈表的合適位置(即該節(jié)點的值大于新鏈表上的節(jié)點的值,又小于后一節(jié)點的值)。最后將新鏈表的頭部返回即可。代碼如下,做了詳細的注釋,應(yīng)該很容易看懂。



    1 class ListNode { 2 int val; 3 ListNode next; 4 ListNode(int x) { 5 val = x; 6 } 7 } 8 /** 9 * 鏈表插入排序 10 * */ 11 public ListNode insertionSortList(ListNode head) { 12 //邊界條件判斷 13 if(head==null || head.next == null) 14 return head; 15 16 //創(chuàng)造一個新的鏈表頭部 17 ListNode pre = new ListNode(-1); 18 //用一個臨時變量保存頭節(jié)點 19 ListNode ans = pre; 20 //cur是原鏈表上的指針 21 ListNode cur = head; 22 while (cur != null) { 23 //每次循環(huán)前重置pre為頭結(jié)點,這樣保證每次都從頭往后遍歷 24 pre = ans; 25 26 //當pre.next.val大于cur.val時停止循環(huán) 27 while (pre.next != null && pre.next.val < cur.val) { 28 pre = pre.next; 29 } 30 31 //pre.next.val 大于 cur.val,此時應(yīng)該把cur插入到pre后 32 //保存原鏈表當前節(jié)點的下一節(jié)點 33 ListNode tmp = cur.next; 34 //把cur插入到pre之后 35 cur.next = pre.next; 36 pre.next = cur; 37 38 //cur指針后移一位 39 cur = tmp; 40 } 41 return ans.next; 42 }

    ?

    ?

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/kexinxin/p/10195970.html

    總結(jié)

    以上是生活随笔為你收集整理的Leetcode 147.对链表进行排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。