java:連結串列排序
阿新 • • 發佈:2019-01-28
題目描述:Sort a linked list using insertion sort.
使用插入排序對連結串列進行排序
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode insertionSortList (ListNode head) {
}
}
【思路】:使用插入排序
插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為O(n^2)。是穩定的排序方法。插入演算法把要排序的陣列分成兩部分:第一部分包含了這個陣列的所有元素,但將最後一個元素除外(讓陣列多一個空間才有插入的位置),而第二部分就只包含這一個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。插入排序的基本思想是:每步將一個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。
ListNode fakeNode=new ListNode(-1);
fakeNode.next=head;
if(head==null)
return null;
ListNode cur=head.next;//從第二個節點開始遍歷
ListNode pre=head;//排好序的最後一個節點
while(cur!=null)
{
if(cur.val<pre.val)
{
ListNode nextNode=cur.next;//儲存下一個需要遍歷的節點
//尋找插入的合適位置
ListNode cur2=fakeNode.next;
ListNode temp=fakeNode;//記錄cur2前面一個節點
while(cur.val>cur2.val&&cur2!=pre)
{
temp=cur2;
cur2=cur2.next;
}
//進行插入
temp.next=cur;
cur.next=cur2;
pre.next=nextNode;
//繼續遍歷下一個節點
cur=nextNode;
}
else {
pre=cur;
cur=cur.next;
}
}
return fakeNode.next;