剑指Offer:合并两个排序的链表

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入下图中的链表1和链表2,则合并之后的升序链表如链表3所示:
这里写图片描述

链表的合并同链表的反转一样是经典的链表操作问题。
这这个问题中我们注意的点有:

  1. 有一个链表是空的,则合并后的链表就是另外一个链表;
  2. 两个链表都是空的,程序停止运行,报错;
  3. 每次选择在两个数中选择更小的数进行插入新链表中是一个归并操作使用递归。

实现代码:
单链表的创建参见[链表][链表代码]

private static LinkNode Merge(LinkNode head1,LinkNode head2){
    if(head1==null&&head2==null){
        return null;//都为空,直接返回null
    }
    if(head1==null){
        return head2;//链表1为空,合并后就是链表2
    }
    if(head2==null){
        return head1;//链表2为空,合并后就是链表1
    }
    //每一次调用就是一次选“头部”的过程
    LinkNode mergeHeadNode = null;//合并后的头结点

    if(head1.getIdata()<head2.getIdata()){
        //链表1最小的数小于链表2最小的数
        mergeHeadNode = head1;//链表1的头部作为新链表的“头部”
        mergeHeadNode.setNext(Merge(head1.getNext(), head2));//在链表1后面的结点中和链表2中选择“头部”
    }else{
        mergeHeadNode = head2;
        mergeHeadNode.setNext(Merge(head2.getNext(), head1));
    }
    return mergeHeadNode;
}

测试代码:

public static void main(String[] args) {
    SingleLinkList list1 = new SingleLinkList();
    list1.insertHead(7);
    list1.insertHead(5);
    list1.insertHead(3);
    list1.insertHead(1);
    System.out.println("list1:");
    list1.displayList();
    SingleLinkList list2 = new SingleLinkList();
    list2.insertHead(8);
    list2.insertHead(6);
    list2.insertHead(4);
    list2.insertHead(2);
    System.out.println("list2:");
    list2.displayList();

    //合并
    SingleLinkList list3 = new SingleLinkList();
    list3.setHead(Merge(list1.getHead(), list2.getHead()));
    System.out.println("list3:");
    list3.displayList();
    SingleLinkList list = new SingleLinkList();
    list.insertHead(8);
    list.insertHead(6);
    list.insertHead(4);
    list.insertHead(2);
    SingleLinkList list4 = new SingleLinkList();
    list4.setHead(Merge(null, list.getHead()));
    System.out.println("list4:");
    list4.displayList();

    SingleLinkList list5 = new SingleLinkList();
    list5.setHead(Merge(null, null));
    System.out.println("list5:");
    list5.displayList();
}

这里写图片描述

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值