阅读 36

1669. 合并两个链表

题目介绍

力扣1669题:leetcode-cn.com/problems/me…

image.png

image.png

分析

可以很快就能想到,只需要得到第a个节点的前一个节点设为left和第b个节点的后一个节点设为right。 然后,将left节点指向list2的头节点,将list2的尾节点指向right节点,即可完成题目要求!

怎么得到leftright这两个节点呢?

看示例不难得出,该题目所谓的第几个节点,其实是从0开始计算的,也就是链表的头节点即为第0个节点。那么得到left节点,只需从list1的头节点往后next->(a - 1)次即可。得到right节点,只需从left节点往后next->(b - a + 2)次即可。最后那么一连,就行了!

有的大家可能对b - a + 2的怎么来的不太明白:(b + 1)-(a - 1)= b + 1-a + 1 = b - a + 2

代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
        ListNode cur = list1;
        int count = b - a + 2;
        // 找到list1中第a个节点的前一个节点
        while ((a - 1) > 0) {
            a--;
            cur = cur.next;
        }
        ListNode left = cur;
        // 找到list1中第b个节点的后一个节点
        while (count > 0) {
            cur = cur.next;
            count--;
        }
        ListNode right = cur; 
        // 将list1中第a个节点的前一个节点指向list2的头节点
        left.next = list2;
        // 找到list2的尾节点
        while(list2.next != null) {
            list2 = list2.next;
        }
        // 将list2的尾节点指向list1中第b个节点的后一个节点
        list2.next = right;
        return list1;
    }
}
复制代码
文章分类
后端