Leetcode -- 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.
For example,
Given 1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.

分析:
在一个链表中,将值小于x的node移到前面去。注意,不能改变node之间原本的相对位置。比如x=3, 1原本出现在2的前面,那么修改后的链表中,值为1的node也必须出现在值为2的前面。

思路1:
遍历,将val小于x的node移到前面去,通过改变指针的指向来实现。这样做有个问题,就是,指针的指向改变比较麻烦,同时,需要提前记录很多值的位置。

代码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) {
        if(!head) return head;
        ListNode* place = new ListNode(0);
        ListNode* h = place;
        ListNode* place_next;
        ListNode* now = head;
        ListNode* now_next;
        ListNode* pre = place;

        place->next = head;
        while(now)
        {
            now_next = now->next;
            if(now->val < x )
            {
                place_next = place->next;
                place->next = now;
                if(place_next != now)
                {
                    now->next = place_next;
                    pre->next = now_next;
                }
                place = now;
            }
            else
            {
               pre = now;
            }
            now = now_next;
        }
        return h->next;
    }
};

【参考思路 引自:https://leetcode.com/discuss/21032/very-concise-one-pass-solution
将值小于x的node弄出来,作为一条链表,将另外一部分作为另外一条链表。最后将两个链表连起来就可以了。相当简单啊,没有复杂的指针变化问题。喜欢!!

代码:

ListNode *partition(ListNode *head, int x) {
    ListNode node1(0), node2(0);
    ListNode *p1 = &node1, *p2 = &node2;
    while (head) {
        if (head->val < x)
            p1 = p1->next = head;
        else
            p2 = p2->next = head;
        head = head->next;
    }
    p2->next = NULL;
    p1->next = node2.next;
    return node1.next;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值