题目
请编写一段代码,实现两个单向有序链表的合并。
思路
申请两个新指针,h3和h3_head,h3_head指向新链表的头结点,h3指向新链表,并可以向后移动位置。
- 如果 h1.val <= h2.val,则h3.next = h1; h1 = h1.next; h3 = h3.next。反之亦然。
- 当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();
}
}