合并两个有序链表
题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
思考分析(递归思想)
初始化:定义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;
}
}
测试:
带主函数,打印链表函数的完整案例
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);
}
}
输出: