合并2个排序的链表

合并2个排序的链表

递归解法和迭代解法

/**
 * 节点实体类
 */
class ListNode {
    public int val;
    public String name;
    public ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}

/**
 * 链表节点类
 */
class Node {

    // next存的是下个节点的引用
    Node next;

    // 值
    int val;

    //为赋值操作的 构造单链表
    public Node(int val) {
        this.val = val;
    }
}

/**
 * 递归法
 * @param list1  看原链表是升序还是降序  生序出来就是从小到大
 * @param list2
 * @return
 */
public static ListNode Merge(ListNode list1, ListNode list2) {

    // list1 list2为空的情况
    if (list1 == null || list2 == null) {
        return list1 != null ? list1 : list2;
    }
    // 两个链表元素依次对比 一开始的list1.val就是第一个  递归出来的条件:l1=null || l2=null 往上返回值了
    if (list1.val <= list2.val) {
        // 递归计算 list1.next, list2
        list1.next = Merge(list1.next, list2);  //确定1个小之后 需要将list1.next和list2进行递归  往上出来的时候 5 的话 上面节点是4
        return list1;  //从小到大
    } else {
        // 递归计算 list1, list2.next
        list2.next = Merge(list1, list2.next);   // list1就是上面去除掉 前一个节点的
        return list2;
    }
}

/**
* 第二种不是递归的 迭代法
*/
public static Node merge(Node node1, Node node2) {
if (node1 == null) {
return node2;
}
if (node2 == null) {
return node1;
}
//伪造节点 0 null 最终将合并的链表放到null的位置
Node head = new Node(0);
Node cur = head; //2个指向同一个地址 改变其中一个地址的值 另一个输出时相应改变
//有一个是null 就不进来
while (node1 != null && node2 != null) {
if (node1.val <= node2.val) {
//cur是中间作用 连接链表
cur.next = node1;
//移动取值的指针 单个链表自己移动指针 单个链表自己移动指针循环
node1 = node1.next;
}else{
cur.next = node2;
node2 = node2.next;
}
}
if (node1 == null) {
cur.next = node2;
}
// 哪个为空 循环完了 连接另一个
if (node2 == null) {
cur.next = node1;
}
return head.next;
}

编写测试类,合并2个链表 ,由小到大顺序排列

public class Test {
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        ListNode listNode6 = new ListNode(6);
        //第一个链表
        listNode1.next = listNode3;
        listNode3.next = listNode5;
        //第二个链表
        listNode2.next = listNode4;
        listNode4.next = listNode6;
        ListNode merge = solution.Merge(listNode1, listNode2);
        System.out.println(merge);

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值