Leetcode 147. 對連結串列進行插入排序 C++
阿新 • • 發佈:2018-12-12
題目描述:
對連結串列進行插入排序。
插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。
示例 1:
輸入: 4->2->1->3 輸出: 1->2->3->4
示例 2:
輸入: -1->5->3->4->0 輸出: -1->0->3->4->5
解題思路:
1、本題要排序,自讓要用到兩個迴圈。首先,新建一個啞節點,這樣會很方便。
2、用member帶表當前需要排序的元素(實際上是member->next,因為一開始member指向了啞節點),member之前的元素都是排序好的,所以,第二個迴圈只要找到需要插入的位置就OK了。然後將正在排序的節點插入到對應位置。
程式碼:
class Solution { public: ListNode* insertionSortList(ListNode* head) { ListNode* newhead=new ListNode(0); newhead->next=head; ListNode* member=newhead;//用member來歷遍整個連結串列 while(member && member->next) { ListNode* temp=newhead;//用temp來表示當前元素之前的元素,如果當前元素小於它之前的值則交換 int flag=0; while(temp!=member) { if(member->next->val < temp->next->val) { ListNode * temp1=member->next;//temp1 和 temp2 是為了插入節點需要的臨時變數 member->next=member->next->next; ListNode * temp2=temp->next; temp->next=temp1; temp1->next=temp2; flag=1; break; } temp=temp->next; } if(flag==0)//如果當前節點的值小於它之前的值,已經發生過交換,那麼,member不需要再移動,如果member再次向後移動了,那麼就跳過了一個元素 { member=member->next; } } return newhead->next; } };