1669. 合并两个链表

46 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

1669. 合并两个链表

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

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

下图中蓝色边和节点展示了操作后的结果:

请你返回结果链表的头指针。

 

示例 1:

输入: list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002]
输出: [0,1,2,1000000,1000001,1000002,5]
解释: 我们删除 list1 中下标为 34 的两个节点,并将 list2 接在该位置。上图中蓝色的边和节点为答案链表。

示例 2:

输入: list1 = [0,1,2,3,4,5,6], a = 2, b = 5, list2 = [1000000,1000001,1000002,1000003,1000004]
输出: [0,1,1000000,1000001,1000002,1000003,1000004,6]
解释: 上图中蓝色的边和节点为答案链表。

 

提示:

  • 3 <= list1.length <= 104
  • 1 <= a <= b < list1.length - 1
  • 1 <= list2.length <= 104

思路

解法一:就是一步步往后迭代,创建一个新的节点;把另外两个lists叠加上去; 解法二:先不改变指针的指向,先确定需要修改的指针的位置,然后一次性改完,时间与上面差不多

ac代码

class Solution {
public:
    ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) {
        ListNode *dummy = new ListNode(0);

        ListNode *p = dummy;
        ListNode *p1 = list1;
        ListNode *p2 = list2;        
        // 先把 位置a之前的拼接到dummy上
        int i=0;
        for (; i<a; i++){
            p->next = p1;
            p = p->next;
            p1 = p1->next;
        }
        // 这里是将整个 list2 全部拼接上去的阿
        p->next = p2;
        // 然后将p遍历到最后一个节点,去接上p1;
        while (p->next != nullptr){
            p = p->next;
        }
        // 现在来接上
        for (; i<b+1; i++){
            p1 = p1->next;
        }
        p->next = p1;
        return dummy->next;
    }
};

ac2

class Solution {
public:
    ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) {
        // 另外的方法就是找到链表的关键位置的指针,然后将指针的指向进行挪动从而找到最优的

        ListNode *p = list1;
        int i=0;
        for (; i<a-1; ++i){
            p = p->next;
        }
        ListNode *node_a = p;  // a节点

        for (; i<b; ++i){
            p = p->next;
        } 
        ListNode *node_b = p;   // b节点

        ListNode *p1 = list2;
        while(p1->next != nullptr){
            p1 = p1->next;
        }
        ListNode *tail = p1;   // 尾节点

        // 以上没有对list1做任何修改,现在开始做修改
        node_a->next = list2;
        tail->next = node_b->next;
        return list1;
    }
};