首页 > 试题广场 >

分隔链表

[编程题]分隔链表
  • 热度指数:164 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。

数据范围:节点的数量满足 ,节点上的值和输入的 x 满足
示例1

输入

{1,4,3,2,5,2},3

输出

{1,2,2,4,3,5}
示例2

输入

{2,1},2

输出

{1,2}

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
NC23 划分链表 同款题目?
发表于 2022-02-09 10:59:21 回复(0)
typedef struct ListNode ListNode;

struct ListNode* partition(struct ListNode* head, int x){
    if(head == NULL)  // 如果传入的链表是空链表
        return NULL;

    ListNode* lessHead = (ListNode*)malloc(sizeof(ListNode));  // 哨兵位
    ListNode* lessTail = lessHead;
    lessTail->next = NULL;
    ListNode* greaterHead = (ListNode*)malloc(sizeof(ListNode));  // 哨兵位
    ListNode* greaterTail = greaterHead;
    greaterTail->next = NULL;

    ListNode* cur = head;
    while(cur)
    {
        printf("cur->val=%d\n", cur->val);
        if(cur->val < x)  // 找小于x的节点
        {
            lessTail->next = cur;
            lessTail = lessTail->next;
            printf("lessTail->val=%d\n", lessTail->val);
        }
        else  // 找大于或等于x的节点
        {
            greaterTail->next = cur;
            greaterTail = greaterTail->next;
            printf("greaterTail->val=%d\n", greaterTail->val);
        }

        cur = cur->next;
    }

    lessTail->next = greaterHead->next;  // 对两个链表进行拼接
    greaterTail->next = NULL;  // 置空,防止新链表出现环
    ListNode* list = lessHead->next;  // list是新链表真正意义上的头节点
    free(greaterHead);  // 释放哨兵位
    free(lessHead);  // 释放哨兵位

    return list; 
}

发表于 2023-02-18 22:38:24 回复(1)
'''双指针插入链表节点,一共分两步'''
class Solution:
    def partition(self , head: ListNode, x: int) -> ListNode:
        dummy,p1 = ListNode(0),head
        dummy.next = head
        p1pre = dummy
        '''step1 找到目标分界节点,及其前一个节点'''
        while p1!=None and p1.val<x:
            p1pre = p1
            p1 = p1.next
        '''step 2 从目标分界节点 p1 往后遍历检查,值<x的节点就往 prep1,p1中 间***r />         p2pre,p2 = p1pre,p1
        while p2!=None:
            if p2.val<x: 
                p2pre.next = p2.next #断尾
                p2.next = p1 #插到前边
                p1pre.next = p2
                p1pre = p2 #指针重置给下一轮
                p2 = p2pre.next
            else:
                p2pre = p2
                p2 = p2.next
        return dummy.next
发表于 2022-02-09 19:02:52 回复(0)

问题信息

难度:
3条回答 1687浏览

热门推荐

通过挑战的用户