本文共 1856 字,大约阅读时间需要 6 分钟。
给你链表,分别为ListNode1和ListNode2,再给你m,n两个大于等于1的正整数,现在要求你把ListNode1的m到n位置的节点删除,并把删除的位置拼接上ListNode2。
ListNode1:1—>2—>3—>4—>5—>6
ListNode2:7—>8m:2
n:3也就是把ListNode1的3、4节点删除,最终得到:
1—>2—>7—>8—>5—>6
我们可以按照m、n的位置对ListNode1进行拆分,分别得到:
head:2—>3—>4—>5—>6
tail:5—>6接下来我们只需要让head.next指向ListNode2的头,再让ListNode2的尾指向tail即可。
public class MergeTwoListNode { public static void main(String[] args) { ListNode head = new ListNode(1); ListNode n1 = new ListNode(2); ListNode n2 = new ListNode(3); ListNode n3 = new ListNode(4); ListNode n4 = new ListNode(5); ListNode n5 = new ListNode(6); head.next = n1; n1.next = n2; n2.next = n3; n3.next = n4; n4.next = n5; ListNode n6 = new ListNode(7); ListNode n7 = new ListNode(8); n6.next = n7; System.out.println("原list1链表:" + head); System.out.println("原list2链表:" + n6); System.out.println("合并后:" + mergeTwoListNode(head, 2, 3, n6)); } public static ListNode mergeTwoListNode(ListNode list1, int a, int b, ListNode list2) { //为了留住原来链表的头节点,一般都可以借助一个哑节点来完成 ListNode dummy = new ListNode(); dummy.next = list1; //准备两个被list1拆分出来的节点,一个作为待拼接的头节点,一个作为待拼接的尾节点 ListNode head = list1; ListNode tail = list1; //遍历,找到头节点、和尾节点的位置,注意头节点只需要遍历到下标的前一个位置,而尾节点需要遍历到下标的下一个位置 for (int i = 0; i <= b; i++) { if (i < a - 1) { head = head.next; } tail = tail.next; } ListNode dummy2 = new ListNode(); dummy2.next = list2; //找到list2的尾节点处 while (list2.next != null) { list2 = list2.next; } //用list2的尾节点拼上tail list2.next = tail; //让头节点的下一个节点指向list2 head.next = dummy2.next; return dummy.next; }}
转载地址:http://nhlrb.baihongyu.com/