返回顶部

1669

给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。

请你将 list1 中下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点的位置。

 

 第一遍

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeInBetween(struct ListNode* list1, int a, int b, struct ListNode* list2){
struct ListNode* beginning2=list2;
struct ListNode* end2=list2;
while(end2->next)
    end2=end2->next;
struct ListNode* p=list1;
struct ListNode* linka=list1;
struct ListNode* linkb=list1;
p=list1;
while(p->next)
    {if(p->next->val==a)
        {linka=p;
        p=p->next;}
    else if(p->next->val==b)
        {linkb=p->next;
        p=p->next;}
    else
        {p=p->next;}
    }
linka->next=beginning2;
end2->next=linkb->next;
return list1;

}

 

 

 

第二遍 参考题解

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeInBetween(struct ListNode* list1, int a, int b, struct ListNode* list2){
struct ListNode* end2=list2;
while(end2->next)
    end2=end2->next;
struct ListNode* preA = list1;
    for (int i = 0; i < a - 1; i++) {
        preA = preA->next;
    }
    struct ListNode* preB = preA;
    for (int i = 0; i < b - a + 2; i++) {
        preB = preB->next;
    }
preA->next=list2;
end2->next=preB;
return list1;

}

 

 

和题解的思路是一样的 把要改的结点先找到 

但是如何找 

自己做的时候忽略了第一个链表的特点 即从0开始依次递增

没有利用这个特点 要把整个链表遍历完才能找到要的结点(找到第二个之后break也试过了还是不行)

 

posted @ 2023-01-31 20:02  YuhangLiuCE  阅读(205)  评论(0编辑  收藏  举报