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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Insertion Sort List,Merge Two Sorted Lists,Sort List

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

Insertion Sort List
Sort a linked list using insertion sort.

1.解題思路

題目很簡單,就是要求用插入排序的方法來為鏈表排序。插入排序就是每次遍歷一個新的元素,將其插入到前面已經排好序的元素中。
因為頭結點沒法確定,所以我們用一個dummy節點;然后開始向后逐個遍歷,當前遍歷的節點為cur,另外sortnode每次都指向已經排好序的第一個節點dummy,然后從dummy開始往后,直到找到sortnode.next.val>=cur.val,則表示cur節點要插到有序鏈表的sortnode后面。

2.代碼

public class Solution {public ListNode insertionSortList(ListNode head) {if(head==null||head.next==null) return head;ListNode dummy=new ListNode(0);ListNode cur=head;while(cur!=null){ListNode sortnode=dummy;while(sortnode.next!=null&&sortnode.next.val<cur.val)sortnode=sortnode.next;ListNode tmp=cur.next;cur.next=sortnode.next;sortnode.next=cur;cur=tmp;}return dummy.next;} }

Merge Two Sorted Lists
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.

1.解題思路

合并兩個有序鏈表,同樣需要構造一個Dummy節點。
1)考慮特殊情況,如果有一個鏈表為空,則直接返回另一個鏈接;
2)利用兩個指針p,q遍歷兩個鏈表,如果都不為空,則循環繼續;
3)使用node指向新鏈表的最后一個節點,初始化為dummy
4) 比較p,q的數值的大小,如果p小于q,則把p加到node.next,并且node賦值為p,而p指針需要前進一個;
5) 結束循環時,check一下是否還有鏈表中有剩余元素,并將剩余元素加入到新鏈表node指針的后面。

2.代碼

public class Solution {public ListNode mergeTwoLists(ListNode l1, ListNode l2) {if(l1==null) return l2;if(l2==null) return l1;ListNode dummy=new ListNode(0);ListNode p=l1;ListNode q=l2;ListNode node=dummy;while(p!=null&&q!=null){if(p.val<q.val){node.next=p;node=p;p=p.next;}else {node.next=q;node=q;q=q.next;}}if(p!=null)node.next=p;if(q!=null)node.next=q;return dummy.next;} }

Sort List

Sort a linked list in O(n log n) time using constant space complexity.

1.解題思路

題目要求時間復雜度為O(n log n),所以我們就想到用歸并排序,自然就想到和上一題的mergeTwoLists。
但要做mergeTwoLists,必須得先將當前的list分割成兩個List,所以采用遞歸實現。
要分割鏈表,最簡單的辦法就是找到中點,那很明顯是利用slow,fast來實現,最后slow就是鏈表的中間點。但要注意我們要將Slow的前一個節點記錄下來pre,在找到中點后,我們要將pre.next=null,這樣鏈表才能分割成2個。
2.代碼

public class Solution {public ListNode sortList(ListNode head) {if(head==null||head.next==null) return head;ListNode slow=head,fast=head,pre=null;while(fast!=null&&fast.next!=null){pre=slow;slow=slow.next;fast=fast.next.next;}pre.next=null;ListNode l1=sortList(head);ListNode l2=sortList(slow);return mergeTwoSortedList(l1,l2);}private ListNode mergeTwoSortedList(ListNode l1,ListNode l2){if(l1==null) return l2;if(l2==null) return l1;ListNode dummy=new ListNode(0);ListNode p=l1;ListNode q=l2;ListNode node=dummy;while(p!=null&&q!=null){if(p.val<q.val){node.next=p;node=p;p=p.next;}else {node.next=q;node=q;q=q.next;}}if(p!=null)node.next=p;if(q!=null)node.next=q;return dummy.next;} }

總結

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

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