您的位置:首页 > 其它

leetcode-Insertion Sort List

2013-11-18 18:54 316 查看
Sort a linked list using insertion sort.

对链表进行插入排序。

方法一:

按照传统插入排序方法,从第二个节点从最后一个节点,依次把节点插入到前面已排好序的链表中的正确位置。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if (head == NULL)
return head;
ListNode *curr, *next, *p1, *p2;
curr = head->next;
head->next = NULL;
//把curr节点插入到正确的位置,head到curr的前一个节点已排序
while (curr != NULL) {
p1 = head;
while (p1!=NULL && p1->val<curr->val) { //找到比curr所指节点大的节点p1,以及p1的前一个节点p2
p2 = p1;
p1 = p1->next;
}
next = curr->next;
if (p1 == head) { //头结点比curr的值大,curr插入到最前面
curr->next = head;
head = curr;
} else {
curr->next = p1;
p2->next = curr;
}
curr = next;
}
return head;
}

template<typename T>
void swap(T &a, T &b) {
T temp = a;
a = b;
b = temp;
}
};


方法二:用递归方法,把排序分成不同的子问题,子问题与原问题具有一样的性质。在这里,可把原问题(对无序链表排序)分成一个子问题(对第一个节点后面的链表排序),然后再把第一个节点插入到正确的位置。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
if (head == NULL)
return head;
ListNode *subListHead, *p1, *p2, *temp;
int val;
subListHead = insertionSortList(head->next); //对后面的链表递归插入排序
p1 = head;
p2 = subListHead;
while (p2 && p1->val > p2->val) { // 插入head的值到正确位置
swap(p1->val, p2->val);
p1 = p2;
p2 = p2->next;
}
return head;
}

void swap(int &a, int &b) {
a = a^b;
b = a^b;
a = a^b;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  插入排序 链表 递归