算法通关村第一关-----链表经典问题之合并有序链表

合并两个有序链表

问题描述

合并两个有序链表
存在链表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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天不coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值