LeetCode | 面试题 02.04. 分割链表

LeetCode | 面试题 02.04. 分割链表

OJ链接

LeetCode | 面试题 02.04. 分割链表_第1张图片

简单的做法:

  • 创建两个带头空链表,大链表和小链表,最后小链表的尾结点和大链表的头结点连接起来

代码如下:

typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x){
    if(head == NULL)
        return head;
    //创建带头的大小链表
    ListNode* lessHead,*lessTail;
    ListNode* greaterHead,*greaterTail;
    
    //创建大小链表的哨兵位
    lessHead = lessTail = (ListNode*)malloc(sizeof(ListNode));
    greaterHead = greaterTail = (ListNode*)malloc(sizeof(ListNode));

    //遍历链表,将节点放到大小链表中
    ListNode* cur = head;
    while(cur)
    {
        if(cur->val < x)
        {
            //放到小链表中
            lessTail->next = cur;
            lessTail = lessTail->next;
        }
        else
        {
            //放到大链表中
            greaterTail->next = cur;
            greaterTail = greaterTail->next;
        }
        cur = cur->next;
    }
    if(greaterTail)
        greaterTail->next = NULL;
    //小链表的尾和大链表的头连接起来
    lessTail->next = greaterHead->next;
    //把动态开辟的空间连接起来
    free(greaterHead);
    ListNode* retHead = lessHead->next;
    free(lessHead);
    return retHead;
}

你可能感兴趣的:(LeetCode,leetcode,链表)