1. 程式人生 > >LeetCode 86. 分隔連結串列(Partition List)

LeetCode 86. 分隔連結串列(Partition List)

題目描述

給定一個連結串列和一個特定值 x,對連結串列進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。
你應當保留兩個分割槽中每個節點的初始相對位置。

示例:

輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5

解題思路1

把所有小於給定值的節點都移到前面,大於該值的節點順序不變,相當於一個區域性排序的問題。首先找到第一個大於或等於給定值的節點,用題目中給的例子來說就是先找到4,然後再找小於3的值,每找到一個就將其取出置於4之前即可。
程式碼展示1

中的pre指標用來定位第一個大於或等於給定值的節點的前一個節點,cur指標則用來定位給定值之後第一個小於給定值的節點的前一個節點,藉助輔助指標tmp來進行連結串列節點的移動操作。

這種解法的連結串列變化順序為:

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