• [编程题] 合并有序链表


    合并两个有序链表

    题目描述

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

    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

  • 相关阅读:
    一般查找 (顺序查找)
    sscanf
    uva-11044-水题
    uva-10785-模拟水题
    uva-10596-欧拉回路
    uva-10879-因数分解
    uva-10562-二叉树
    扯皮的cplex-感觉时间不对
    cplex-Java-样例代码解析
    cplexJava源码---计算结果
  • 原文地址:https://www.cnblogs.com/jiyongjia/p/13193577.html
Copyright © 2020-2023  润新知