您的位置:首页 > Web前端

合并两个排序的链表-剑指Offer(Java语言)

2019-02-25 07:58 281 查看

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路

方法一:非递归

  1. 比较链表1的第一个结点与链表2的第一个结点,将小的那个拿出来作为新链表的第一个结点
  2. 假设链表1的第一个结点更小,继续比较链表1的第二个结点与链表2的第一个结点,将小的那个拿出来作为新链表的第二个结点
  3. 以此类推直到其中一个链表全部拿走,将另一个链表剩余的结点加到新链表的尾部

具体实现时,为了不用特殊处理新链表的第一个结点,考虑新增一个头结点。

[code]/*
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1==null) return list2;//若其中一个链表为null,则结果为另一个链表
if(list2==null) return list1;
ListNode head=new ListNode(0);//新增头结点
//因为要最后返回头结点的下一个结点,所以需要保留头结点的引用,这里用新变量来做循环
ListNode p=head;
while(list1!=null&&list2!=null){
if(list1.val<=list2.val){
p.next=list1;
p=p.next;
list1=list1.next;
}else{
p.next=list2;
p=p.next;
list2=list2.next;
}
}
//将剩余的一个链表添加到新链表尾部
if(list1!=null) p.next=list1;
if(list2!=null) p.next=list2;
return head.next;//返回头结点的下一个结点
}

}

方法二:递归

递归思路:

  1. 比较链表1的第一个结点与链表2的第一个结点,假设链表1的第一个结点更小,则该结点为新链表的结点
  2. 递归处理链表1的第二个结点与链表2的第一个结点
[code]/*
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1==null) return list2;
if(list2==null) return list1;
if(list1.val<list2.val){
list1.next=Merge(list1.next,list2);
return list1;
}else{
list2.next=Merge(list1,list2.next);
return list2;
}
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: