LeetCode No.86 Partition List

来源:互联网 发布:怎么在淘宝申请开店 编辑:程序博客网 时间:2024/06/07 05:35

题目:给定一个链表和一个值x,划分链表使得所有小于x的节点出现在所有大于等于x的节点之前,并且保持这些节点的相对顺序不变。

例子:1->4->3->2->5->2      x = 3,则应该返回  1->2->2->4->3->5;


思路:这题既然是要把链表划分为两部分,那么我们不妨创建两个新的头节点,一个链接划分后的链表的前半部分,一个链接划分后的链表的后半部分。然后我们在遍历链表的过程中依次将原链表中的节点与这两个新的头节点链接起来,最后再将这两个子链表对接即可!


代码如下:

/** * 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)     {        //左节点用来链接所有小于x的节点        ListNode left = ListNode(0);        //右节点用来链接所有大于等于x的节点        ListNode right = ListNode(0);        ListNode *l = &left, *r = &right;                ListNode *curr = head;        while(curr != nullptr)        {            //使用这个引用可以只用一条语句来修改l或者r            //否则需要两个if语句块,不够简洁            ListNode *&t = curr->val < x ? l : r;            t->next = curr;            t = t->next;            curr = curr->next;        }                //将左右两条链表链接起来        l->next = right.next;        r->next = nullptr;        return left.next;    }};

下面是运行结果:


原创粉丝点击