[编程题] 合并有序链表

合并两个有序链表

题目描述

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

image-20200625233039452

思考分析(递归思想)

​ 初始化:定义cur指向新链表的头结点
​ 操作:
​ 如果l1指向的结点值小于等于l2指向的结点值,则将l1指向的结点值链接到cur的next指针,然后l1指向下一个结点值
​ 否则,让l2指向下一个结点值
​ 循环步骤1,2,直到l1或者l2为nullptr
​ 将l1或者l2剩下的部分链接到cur的后面

牛客-Java代码

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    
    public ListNode Merge(ListNode list1,ListNode list2) {
        //两个链表的头节点
        ListNode head1 = list1;
        ListNode head2 = list2;

        //新的返回的那个链表的头节点
        ListNode vhead = new ListNode(-1);
        ListNode cur = vhead;
        while (head1!=null && head2!=null){
            if (head1.val<head2.val){
                cur.next = head1;
                head1 = head1.next;
            }else {
                cur.next = head2;
                head2 = head2.next;
            }
            //本次cur往前移动一位
            cur = cur.next;
        }

        //因为上述的while中主要有一个链表到头了就停止了,那么我们把没到头的那个链表的信息挂到最后
        cur.next = head1==null?head2:head1;  //如果head1到头了即为null,我们就取head2

        return vhead.next;
    }
}

测试:

image-20200625233422101

带主函数,打印链表函数的完整案例

package jianzhioffer;

import org.w3c.dom.NodeList;

import java.util.LinkedList;

/**
 * @author jiyongjia
 * @create 2020/6/25 - 22:39
 * @descp:
 */
public class P17_MergeLinkedList {

    static class ListNode {
        int val;
        ListNode next = null;

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

        @Override
        public String toString() {
            return "Node[" +
                    "val=" + val +
                    ']';
        }
    }

    public ListNode Merge(ListNode list1,ListNode list2) {
        //两个链表的头节点
        ListNode head1 = list1;
        ListNode head2 = list2;

        //新的返回的那个链表的头节点
        ListNode vhead = new ListNode(-1);
        ListNode cur = vhead;
        while (head1!=null && head2!=null){
            if (head1.val<head2.val){
                cur.next = head1;
                head1 = head1.next;
            }else {
                cur.next = head2;
                head2 = head2.next;
            }
            //本次cur往前移动一位
            cur = cur.next;
        }

        //因为上述的while中主要有一个链表到头了就停止了,那么我们把没到头的那个链表的信息挂到最后
        cur.next = head1==null?head2:head1;  //如果head1到头了即为null,我们就取head2

        return vhead.next;
    }

    public void display(ListNode listNode){
        while (listNode!=null){
            System.out.print(listNode+"-->>");
            listNode = listNode.next;
        }
    }

    public static void main(String[] args) {
        ListNode node1_1 = new ListNode(1);
        ListNode node1_2 = new ListNode(3);
        ListNode node1_3 = new ListNode(5);
        ListNode node1_4 = new ListNode(7);

        node1_1.next = node1_2;
        node1_2.next = node1_3;
        node1_3.next = node1_4;
        node1_4.next = null;


        ListNode node2_1 = new ListNode(2);
        ListNode node2_2 = new ListNode(4);
        ListNode node2_3 = new ListNode(6);
        ListNode node2_4 = new ListNode(8);
        node2_4.next=null;

        node2_1.next = node2_2;
        node2_2.next = node2_3;
        node2_3.next = node2_4;

        P17_MergeLinkedList p17 = new P17_MergeLinkedList();

        System.out.println("链表1:");
        p17.display(node1_1);

        System.out.println();
        System.out.println("链表2:");
        p17.display(node2_1);

        //合并
        ListNode merged = p17.Merge(node1_1, node2_1);


        System.out.println();
        System.out.println("合并结果:");
        p17.display(merged);

    }
}

输出:

image-20200625233603541

原文地址:https://www.cnblogs.com/jiyongjia/p/13193577.html