前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode刷题(2)【链表】【合链表&链表的中间结点】(C语言)

LeetCode刷题(2)【链表】【合链表&链表的中间结点】(C语言)

作者头像
半生瓜的blog
发布2023-05-12 21:17:34
2310
发布2023-05-12 21:17:34
举报
文章被收录于专栏:半生瓜のblog半生瓜のblog


快慢指针问题:

思路:定义一个快指针和一个慢指针,快指针走到结束的时候,慢指针刚好走到一半。

链表的中间结点。

876. 链表的中间结点 - 力扣(LeetCode) (leetcode-cn.com)

代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast != NULL && fast->next != NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

合并两个有有序链表:

21. 合并两个有序链表 - 力扣(LeetCode) (leetcode-cn.com)

思路:从头开始取两个链表中小的那个尾插到新链表。

代码语言:javascript
复制
/**
 * 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;
    }
    //定义一个头指针head和尾指针tail
    struct ListNode* head = NULL;
    struct ListNode* tail = NULL;
    //如果来个两边都不是空链表进入迭代循环 
    while(l1 != NULL && l2 != NULL)
    {
        //如果取出来的值l1的小于l2的
        if(l1->val < l2->val)
        {
            //如果新链表是第一次插入
            if(tail == NULL)
            {
                //头尾指针都是l1的这一个元素
                head = tail = l1;
            }
            //如果新链表不是第一次插入
            else
            {
                //新链表的下一个结点是l1这个与元素
                tail->next = l1;
                //现在的尾巴是传入的这个元素
                tail = tail->next;
            }
            //链表l1的第一个元素往后推移一个
            l1 = l1->next;
        }
        //如果l1的第一个元素大于等于l2的第一个元素
        //下面同上
        else
        {
            if(tail == NULL)
            {
                head = tail = l2;
            }
            else
            {
                tail->next = l2;
                tail = tail->next;
            }
            l2 = l2->next;
        }
    }
    //循环结束
    //如果链表l1或者链表l2其中的一个还有元素,那么就直接插到后面
    if(l1 != NULL)
    {
        tail->next = l1;
    }
    if(l2 != NULL)
    {
        tail->next = l2;
    }
    return head;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档