《剑指offer》(十六)-合并两个排序的链表(java)
2019-12-01 本文已影响0人
鼠小倩
合并两个排序的链表
考点:链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
代码格式
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
}
}
image.png
注:链表1和链表2是两个递增排序的链表,合并这两个链表得到升序链表为链表3.
解题一-递归
1.思路
首先分析合并两个链表的过程。我们的分析从合并两个链表的头结点开始。链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点将是合并后链表的头结点。如下图所示。
image.png
- 链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点是合并后链表的头结点。
- 在剩余的结点中,链表2的头结点的值小于链表1的头结点的值,因此链表2的头结点是剩余结点的头结点,把这个结点和之前已经合并好的链表的尾结点链接起来。
继续合并两个链表中剩余的结点(图中虚线框所示)。在两个链表中剩下的结点依然是排序的,因此合并这两个链表的步骤和前面的步骤是一样的。我们还是比较两个头结点的值。此时链表2的头结点的值小于链表1的头结点的值,因此链表2的头结点的值将是合并剩余结点得到的链表的头结点。我们把这个结点和前面合并链表时得到的链表的尾结点(值为1的结点)链接起来,如图所示。
2.代码
/*
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 head;
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
if(list1==null||list2==null){
return null;
}
if(list1.val<=list2.val){
head=list1;
head.next=Merge(list1.next,list2);
}else{
head=list2;
head.next=Merge(list1,list2.next);
}
return head;
}
}
解题二-非递归
2.代码
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 head=new ListNode(-1);//为什么这样子是新建一个头结点?
//因为这样子是利用了构造方法创建一个链表
//其实也可以ListNode list = null;
head.next=null;
ListNode root=head;
if (list1 == null) {//还要判断是不是空链表,全部考虑玩所有的情况
return list2;
}
if (list2 == null) {
return list1;
}
while(list1!=null&&list2!=null){
if(list1.val<list2.val){
head.next=list1;
head=list1;
list1=list1.next;
}else{
head.next=list2;
head=list2;
list2=list2.next;
}
}
//把未结束的链表连接到合并后的链表尾部
if(list1!=null){
head.next=list1;
}
if(list2!=null){
head.next=list2;
}
return root.next; //返回头结点
}
}