86. Partition List

86. Partition List

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

Example:

Input: head = 1->4->3->2->5->2, x = 3
Output: 1->2->2->4->3->5

方法1:

prev指向 第一个大于等于x的前一个节点(1), current向前搜索并指向下一个小于x的前一个节点(3),tmp指向下一个小于x的节点(2)。swap之后向前推进prev。

易错点:

  1. 这里的current是指向前一个,而tmp是想要交换的节点
  2. 前进时的判断条件,pre遇到<x时前进,current遇到>=时前进
// 1   ->   4    ->    3    ->    2    ->    5    ->    2
//prev              current      tmp        
// 1   ->   2    ->    4    ->    3    ->    5    ->    2
//prev     tmp                  current
// 1   ->   2    ->    4    ->    3    ->    5    ->    2
//         prev                 current     
// 1   ->   2    ->    4    ->    3    ->    5    ->    2
//         prev                            current     tmp

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        if (!head) return head;
        
        ListNode* newHead = new ListNode(-1);
        newHead -> next = head;
        ListNode* prev = head;
        while (prev -> next && prev -> next -> val < x) {
            prev = prev -> next;
        }
        
        ListNode* current = prev;
        while (current -> next)  {
            if (current -> next -> val >= x){
                current = current -> next;
            }
            else {
                ListNode* tmp = current -> next;
                current -> next = tmp -> next;
                tmp -> next = prev -> next;
                prev -> next = tmp;
                
                prev = prev -> next;
                // current = current -> next;
            }
        }
    }
};

方法2:

grandyang: http://www.cnblogs.com/grandyang/p/4321292.html

此题还有一种解法,就是将所有小于给定值的节点取出组成一个新的链表,此时原链表中剩余的节点的值都大于或等于给定值,只要将原链表直接接在新链表后即可

class Solution {
public:
    ListNode *partition(ListNode *head, int x) {
        if (!head) return head;
        ListNode *dummy = new ListNode(-1);
        ListNode *newDummy = new ListNode(-1);
        dummy->next = head;
        ListNode *cur = dummy, *p = newDummy;
        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 = dummy->next;
        return newDummy->next;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值