【大厂面试真题-字节】合并链表

94 阅读2分钟

题目描述

给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。请你将 list1 中下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点的位置。请你返回结果链表的头指针。3 <= list1.length <= 10^41 <= a <= b < list1.length - 1  可以不用考虑,a-b删除完之后,list1为空1 <= list2.length <= 10^4

示例

示例:输入:list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002]输出:[0,1,2,1000000,1000001,1000002,5]

思路

这个其实是一个典型的操作链表的题目,相当于将A链表插入到B链表的中间去,只是这里还有将B链表中的部分结点删去的动作。但是只要对链表理解到了都很简单。首先遍历链表list1,找到下标为a的结点,并且记录a的上一个结点,然后找到下标为b的结点,并且记录b的下一个结点,然后找到list2的最后一个结点,接下来开始进行连接操作,将a的上一个结点的next指向list2的头结点,将list2的最后一个结点指向b的下一个结点,即可完成连接操作,符合题意。图片

实现

实现很简单,将上述思路实现即可。github地址

public static void main(String[] args) {
        MergeInBetween mergeInBetween = new MergeInBetween();
        ListNode list1 = new ListNode(0);
        list1.next = new ListNode(1);
        list1.next.next = new ListNode(2);
        list1.next.next.next= new ListNode(3);
        list1.next.next.next.next= new ListNode(4);
        list1.next.next.next.next.next = new ListNode(5);
        ListNode list2 = new ListNode(100000);
        list2.next = new ListNode(2000);

        ListNode result = mergeInBetween.mergeInBetween(list1, 3, 4, list2);
        System.out.println("ddd");
    }
public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
        ListNode tempList1 = list1;
        //记录A下标的上一个结点
        ListNode lastA = null;
        //记录B下边的下一个结点
        ListNode nextB = null;
        int index = 0;
        ListNode last = null;
        while (null != tempList1) {
            if (index == a) {
                lastA = last;
            }
            if (index == b) {
                nextB = tempList1.next;
                break;
            }
            last = tempList1;
            tempList1 = tempList1.next;
            ++ index;
        }
        //记录list2的最后一个结点
        ListNode last2 = null;
        ListNode tempList2 = list2;
        while (null != tempList2) {
            last2 = tempList2;
            tempList2 = tempList2.next;
        }
        //连接两个链表
        lastA.next = list2;
        last2.next = nextB;
        return list1;
    }