1. 程式人生 > >Leetcode 147. 對連結串列進行插入排序 C++

Leetcode 147. 對連結串列進行插入排序 C++

題目描述:

對連結串列進行插入排序。 

插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。

示例 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;
    }
};