合并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);
}
}