合并两个有序链表
问题描述
存在链表A(1->2->4),和链表B(1->3->4),A和B都是有序链表,要求将A,B合成一个链表,合成后的链表包含A,B链表的所有元素,且仍然是有序的。详见leetcode
方法介绍
新建一个链表C,遍历链表A和B,比较当前遍历值的大小,将值较小的链表节点插入链表C的尾部,直至A,B链表遍历结束,所得链表C即是合并后的有序链表。
代码实现
public static LinkedNode mergeTwoSortedLinkedList(LinkedNode headA, LinkedNode headB) {
//新建一个链表,用于存储合并之后的链表
LinkedNode headC = new LinkedNode(-1);
//新建一个指针,指向新建链表的最后一个节点,用于每次插入最小节点
LinkedNode iter = headC;
// 两个待合并链表都不为空时,比较数据域大小,将数值较小的节点插入新链表
while (headA != null && headB != null) {
if (headA.data < headB.data) {
iter.next = headA;
headA = headA.next;
iter = iter.next;
} else {
iter.next = headB;
headB = headB.next;
iter = iter.next;
}
}
//此时只有一个链表不为空,或全都为空,全都为空不操作,
// 只有一个链表为空,直接拼接链表的剩余节点的头节点,不用遍历插入
if (headA != null) {
iter.next = headA;
}
if (headB != null) {
iter.next = headB;
}
//最后返回的是headC.next,而不是headC
//因为新建链表的头节点没有意义,只是为了插入方便
return headC.next;
}
合并K个有序链表
问题描述
存在多个有序链表,将其合并成一个有序链表,详见leetcode
方法介绍
最简单的方法就是先合并前两个,合并结果与第三个合并,合并结果与第四个合并
代码实现
public static LinkedNode mergeKSortedLinkedList(List<LinkedNode> linkedNodeList) {
LinkedNode res = null;
for (LinkedNode linkedNode : linkedNodeList) {
res = mergeTwoSortedLinkedList(res, linkedNode);
}
return res;
}
举一反三
问题描述
存在两个链表 list1和list2,下标均从0开始,现要求将list1从下标a-b删除(包含a,b下标对应的节点),并将list2插入到list1的a,b区间内。详见leetcode
方法介绍
设置一个指针,遍历list1,找下标a-1和下标b+1对应的节点preA,和postB,遍历list2,找到lis2的尾节点last2,进行插入操作 preA.next = list2,last2.next = postB
代码实现
public static LinkedNode mergeInBetween(LinkedNode list1, int a, int b, LinkedNode list2) {
LinkedNode iter = list1;
for(int i=0;i<a-1;i++){
iter = iter.next;
}
LinkedNode node1 = iter;
for(int i = 0; i<b-a+2;i++){
iter = iter.next;
}
LinkedNode node2 = iter;
iter = list2;
while(iter.next!=null){
iter = iter.next;
}
node1.next = list2;
iter.next = node2;
return list1;
}