【Leetcode】链表的合并与分割

合并两个有序链表

首先看题目描述:
在这里插入图片描述
当看完题目后,我们知道实现两链表的合并不可能在原链表中完成,所以我们需要新建链表,通过对原先两链表之间各个节点的比较依次将节点尾插在新建的链表中,最后返回新节点即可。图示如下:
在这里插入图片描述
需要注意的是,当两链表中有一个链表已经走到尾结点,那么证明另一个链表中的剩下的节点的值都是比走结束的那个链表中的节点值要大,所以最后还需将这些剩下的节点都尾插到新链表中。
代码实现如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    if(l1==NULL)
    return l2;
    if(l2==NULL)
    return l1;
    struct ListNode*newhead=NULL;
    struct ListNode*tail=NULL;
    struct ListNode*n1=l1;
    struct ListNode*n2=l2;
    while(n1 && n2)
    {
        if(n1->val < n2->val)
        {
            if(tail==NULL)
            {
                newhead=tail=n1;
            }
            else
            {
                tail->next=n1;
                tail=n1;
            }
            n1=n1->next;
        }

        else
        {
            if(tail==NULL)
            {
                newhead=tail=n2;
            }
            else
            {
                tail->next=n2;
                tail=n2;
            }
            n2=n2->next;
        }
    }
    if(n1)
    tail->next=n1;
    if(n2)
    tail->next=n2;
    return newhead;
}

链表分割

在这里插入图片描述
思路:首先需要定义两段新链表,一段链表(定义为 lessHead )用来保存值小于 x 的节点,另一段链表(定义为 greaterHead )用来保存值不小于 x 的节点;然后再对原先的链表进行遍历,值小于 x 的节点尾插到 lessHead 中,值不小于 x 的节点尾插到 greaterHead 中;最后在将 greaterHead 尾插到 lessHead 中就OK,实现如下:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/

ListNode* partition(ListNode* pHead, int x) {
        // write code here
        ListNode*lessHead,*greaterHead,*lessTail,*greaterTail;
        lessHead=lessTail=(ListNode*)malloc(sizeof(ListNode));
        greaterHead=greaterTail=(ListNode*)malloc(sizeof(ListNode));
        ListNode*cur=pHead;
        while(cur)
        {
            if(cur->val<x) //若val比x小,则尾插到lessTail中
            {
               lessTail->next=cur;
               lessTail=cur;
            }
            else
            {
                greaterTail->next=cur; //若val不比x小,则尾插到greaterTail中
                greaterTail=cur;
            }
            cur=cur->next;
        }
        lessTail->next=greaterHead->next; //因为greaterHead是malloc出来的,所以注意是将原先链表
                                          //中的节点中尾插到lessTail后                           
        greaterTail->next=NULL;
        ListNode*newhead=lessHead->next; //定义新的头节点为lessHead的后一个节点,这样才能保
                                         //证返回的是原本链表中的节点
        free(lessHead); //动态申请的空间注意最后要释放
        free(greaterHead); //同上
        return newhead;
    }
  • 49
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值