题目:链表划分
问题描述:给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。你应该保留两部分内链表节点原有的相对顺序。如:给定链表 1->4->3->2->5->2->null,并且 x=3,返回 1->2->2->4->3->5->null。
思路:在给定元素左右两边分别新建两个链表。遍历给定链表,比较元素的大小。如果元素小于给定的这个元素,则插入左边的链表中,否则插入右边的链表中。遍历结束后,左链表的最后一个元素指向右边链表的第一个元素,使两个链表连接起来。
代码:
class Solution {
public:
/**
* @param head: The first node of linked list.
* @param x: an integer
* @return: a ListNode
*/
ListNode *partition(ListNode *head, int x) {
if (head == NULL) {
return NULL;
}
ListNode *leftDummy = new ListNode(0);
ListNode *rightDummy = new ListNode(0);
ListNode *left = leftDummy, *right = rightDummy;
while (head != NULL) {
if (head->val < x) {
left->next = head;
left = head;
}
else {
right->next = head;
right = head;
}
head = head->next;
}
right->next = NULL;
left->next = rightDummy->next;
return leftDummy->next;
}
};
感想:没想到一道题可以通过新建两个链表来解决,又get一种新技能。