算法—链表合并

题目

请编写一段代码,实现两个单向有序链表的合并。

思路

申请两个新指针,h3和h3_head,h3_head指向新链表的头结点,h3指向新链表,并可以向后移动位置。

  1. 如果 h1.val <= h2.val,则h3.next = h1; h1 = h1.next; h3 = h3.next。反之亦然。
  2. 当h1或者h2其中一个链表遍历结束后,h3指向另一个链表h1或者h2剩下的部分。

代码

import java.util.Scanner;
public class Main{
    //链表的数据结构
    static class ListNode{
        int val;
        ListNode next = null;
        ListNode(int val){
            this.val = val;
        }
        ListNode(){
            
        }
    }
    public static ListNode mergeList(ListNode h1, ListNode h2){
        //先判断h1,h2是否为空
        if(h1 == null){
            return h2;
        }
        if(h2 == null){
            return h1;
        }
        ListNode h3 = new ListNode(); //开辟一个新节点空间,并将now指向该空间
        ListNode h3_head = h3;
        while(h1 != null && h2 != null){
            if(h1.val <= h2.val){
                h3.next = h1;
                h1 = h1.next;
            }else{
                h3.next = h2;
                h2 = h2.next;
            }
            h3 = h3.next;
        }
        if(h1 != null){
            h3.next = h1;
        }
        if(h2 != null){
            h3.next = h2;
        }
        return h3_head;
    }
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        String str1[] = sc.nextLine().split(" ");
        String str2[] = sc.nextLine().split(" ");
        int len1 = str1.length;
        int len2 = str2.length;
        int arr1[] = new int[len1];
        int arr2[] = new int[len2];
        for(int i=0; i<len1; i++){
            arr1[i] = Integer.parseInt(str1[i]);
        }
        for(int j=0; j<len2; j++){
            arr2[j] = Integer.parseInt(str2[j]);
        }
        //将两个数组转化成链表
        ListNode h1 = new ListNode(arr1[0]);
        ListNode h2 = new ListNode(arr2[0]);
        ListNode p1 = h1;
        ListNode p2 = h2;
        //把链表1的剩余元素加进来
        for(int m=1; m<len1; m++){
            ListNode q1 = new ListNode(arr1[m]);
            p1.next = q1;
            p1 = q1;
            p1.next = null;
        }
        //把链表2的剩余元素加进来
        for(int n=1; n<len2; n++){
            ListNode q2 = new ListNode(arr2[n]);
            p2.next = q2;
            p2 = q2;
            p2.next = null;
        }
        ListNode head = mergeList(h1, h2); //合并两个链表
        ListNode node = head.next; //注意新链表是从head.next开始的
        //遍历链表
        while(node != null){
            System.out.printf("%d ", node.val);
            node = node.next;
        }
        sc.close();
    }
}

运行结果

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值