目录
1、题目介绍
输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5]
示例 2:
输入:head = [2,1], x = 2 输出:[1,2]
提示:
- 链表中节点的数目在范围
[0, 200]
内-100 <= Node.val <= 100
-200 <= x <= 200
2、解题方法:模拟
简单来说我们可以先用两个链表 small 和 large 来分别存放所有小于x的节点和大于x的节点,small 链表按顺序存储所有小于 x 的节点,large 链表按顺序存储所有大于等于 x 的节点。
在遍历完原链表后,只要将 small 链表尾节点指向 large 链表的头节点即能完成对链表的分隔。
为了实现这一想法,还需要用到两个指针smallH和largeH来分别指向small链表和large链表的第一个节点。
具体规则:
1.当head->val小于x时,把head当前指向的节点加到small当前指向节点的下一个节点,然后head指向下一个节点,small指向下一个节点; 即执行 small->next = head; small = small->next; head = head->next;
2.head->val大于或者等于x,把head当前指向的节点加到large当前指向节点的下一个节点,然后head指向下一个节点,large指向下一个节点; 即执行 large->next = head; large = large->next; head = head->next;
最后把largeH(注意这里是largeH,不是large)当前指向节点的下一个节点加到small(注意这里是small,不是smallH)当前指向节点的下一个节点,把两个链表链接起来,然后返回smallH(注意这里是smallH,不是small)当前指向节点的下一个节点;即执行 small->next = largeH->next; return smallH->next;
话不多说,看图:
先创建small链表和large链表,然后把smallH和largeH两个指针分别指向small链表和large链表的第一个节点。
这时候的head->val等于1;head->val小于x,所以把head当前指向的节点加到small当前指向节点的下一个节点,然后head指向下一个节点,small指向下一个节点; 即执行 small->next = head; small = small->next; head = head->next;
这时候的head->val等于4;head->val大于x,所以把head当前指向的节点加到large当前指向节点的下一个节点,然后head指向下一个节点,large指向下一个节点; 即执行 large->next = head; large = large->next; head = head->next;
这时候的head->val等于3;head->val等于x,所以把head当前指向的节点加到large当前指向节点的下一个节点,然后head指向下一个节点,large指向下一个节点; 即执行 large->next = head; large = large->next; head = head->next;
这时候的head->val等于2;head->val小于x,所以把head当前指向的节点加到small当前指向节点的下一个节点,然后head指向下一个节点,small指向下一个节点; 即执行 small->next = head; small = small->next; head = head->next;
这时候的head->val等于5;head->val大于x,所以把head当前指向的节点加到large当前指向节点的下一个节点,然后head指向下一个节点,large指向下一个节点; 即执行 large->next = head; large = large->next; head = head->next;
这时候的head->val等于2;head->val小于x,所以把head当前指向的节点加到small当前指向节点的下一个节点,然后head指向下一个节点,small指向下一个节点; 即执行 small->next = head; small = small->next; head = head->next;
这时候head等于NULL了,所以结束循环;然后把largeH(注意这里是largeH,不是large)当前指向节点的下一个节点加到small(注意这里是small,不是smallH)当前指向节点的下一个节点,把两个链表链接起来,然后返回smallH(注意这里是smallH,不是small)当前指向节点的下一个节点;即执行 small->next = largeH->next; return smallH->next;
3、解题代码
因为我们不知道head链表有多少给节点,所以在创建small链表和large链表两个链表时要借助C语言里的malloc()函数。malloc时动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址。
struct ListNode* partition(struct ListNode* head, int x){
struct ListNode* small = malloc(sizeof(struct ListNode));
struct ListNode* large = malloc(sizeof(struct ListNode));
struct ListNode* smallH = small;
struct ListNode* largeH = large;
//当head不为空时就执行循环语句,head为空时就结束循环
while(head != NULL){
if(head->val < x){
small->next = head;
small = small->next;
} else{
large->next = head;
large = large->next;
}
head = head->next;
}
large->next = NULL;
small->next = largeH->next;
return smallH->next;
}
相关【LeetCode力扣】: