LeetCode刷题之合并两个链表(源代码➕讲解)

        题目链接放在这里了力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

1. 题目分析

        先读题,分清楚题中给的信息,我们做题一定要看末尾给的变量范围,学会自己整理:

1. 两个链表分别为list1和list2,list1长度是(≥3)list2长度是(≥1);就说明都不为空,可以不用专门判断为空的时候。

2. a和b是下标的位置,下标是从0开始的。(1≤a≤b≤list1.length-1)

3. 要删除的位置合起来是个链表,所以是要删除以a位置为头节点,b位置为尾结点的子链表。

4. 删除之后将list1被删除的位置和list2链接起来。

5. 这里挺好的,没有什么临界的,如果想做临界的,可以试试a可以为0,list2可以为空。

LeetCode刷题之合并两个链表(源代码➕讲解)_第1张图片

LeetCode刷题之合并两个链表(源代码➕讲解)_第2张图片

2. 源代码(内含解释)

struct ListNode* mergeInBetween(struct ListNode* list1, int a, int b, struct ListNode* list2)
{
    struct ListNode* cura = list1;//遍历到a位置前一个节点处
    struct ListNode* curb = list1;//遍历到b位置后一个节点处
    struct ListNode* cur = list2;//遍历到list2尾结点
    int A = a;
    int B = b;
    //用cura_0来记录要删除的子链表的头节点的前驱节点
    while(--A)
    {
        cura = cura->next;
    }
    //找到list2的尾结点
    while(cur->next)
    {
        cur = cur->next;
    }
    //在这里b++的原因是要找到要删除的子链表的尾结点的后继节点
    B++;
    while(B--)
    {
        curb = curb->next;
    }
    cura->next = list2;
    cur->next = curb;
    return list1;
}

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