LeetCode 86. 分隔連結串列(Partition List)
阿新 • • 發佈:2018-11-05
題目描述
給定一個連結串列和一個特定值 x,對連結串列進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。
你應當保留兩個分割槽中每個節點的初始相對位置。
示例:
輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5
解題思路1
把所有小於給定值的節點都移到前面,大於該值的節點順序不變,相當於一個區域性排序的問題。首先找到第一個大於或等於給定值的節點,用題目中給的例子來說就是先找到4,然後再找小於3的值,每找到一個就將其取出置於4之前即可。
程式碼展示1
這種解法的連結串列變化順序為:
1 -> 4 -> 3 -> 2 -> 5 -> 2
1 -> 2 -> 4 -> 3 -> 5 -> 2
1 -> 2 -> 2 -> 4 -> 3 -> 5
程式碼展示1
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
//ListNode *beforehead=new ListNode(0);
ListNode *beforehead=(ListNode*)malloc(sizeof(ListNode));//建立頭節點,用上句被註釋的也可,上句中的0是拿來開闢記憶體的,其他值也可以
beforehead->next=head;
ListNode *pre=beforehead;
ListNode * cur=head;
while(pre->next&&pre->next->val<x){
pre=pre->next;
}
cur=pre;
while(cur->next){
if(cur->next->val<x){
ListNode *tmp=cur->next;
cur->next=tmp->next;
tmp->next=pre->next;
pre->next=tmp;
pre=pre->next;
}
else{
cur=cur->next;
}
}
return beforehead->next;
}
};
解題思路2
此題還有一種解法,就是將所有小於給定值的節點取出組成一個新的連結串列,此時原連結串列中剩餘的節點的值都大於或等於給定值,只要將原連結串列直接接在新連結串列後即可。
此種解法連結串列變化順序為:
1.Original: 1 -> 4 -> 3 -> 2 -> 5 -> 2
New:
2.Original: 4 -> 3 -> 2 -> 5 -> 2
New: 1
3.Original: 4 -> 3 -> 5 -> 2
New: 1 -> 2
4.Original: 4 -> 3 -> 5
New: 1 -> 2 -> 2
5.Original:
New: 1 -> 2 -> 2 -> 4 -> 3 -> 5
程式碼展示2
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
//ListNode *beforehead=new ListNode(0);
ListNode *beforehead=(ListNode*)malloc(sizeof(ListNode));
ListNode *newbeforehead=(ListNode*)malloc(sizeof(ListNode));
beforehead->next=head;
ListNode *cur=beforehead;
ListNode *p=newbeforehead;
while(cur->next){
if(cur->next->val<x){
p->next=cur->next;
p=p->next;
cur->next=cur->next->next;
p->next=NULL;
}
else{
cur=cur->next;
}
}
p->next=beforehead->next;
return newbeforehead->next;
}
};