题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
输入描述
两个单调递增的链表
输出描述
一个单调不减的链表
题目分析
节点申明:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
解法一 (递归) 运行时间:31ms 占用内存:629k
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1==null) return list2;
if(list2==null) return list1;
ListNode mergeHead=null;
if(list1.val<=list2.val){
mergeHead = list1;
mergeHead.next = Merge(list1.next,list2);
}else{
mergeHead = list2;
mergeHead.next = Merge(list1,list2.next);
}
return mergeHead;
}
}
首先,判断链表是否为空,如果其中一个为空就直接返回另一个链表。
因为合并后的链表要满足单调不减,比较两个链表当前头结点,值较小的赋值给合并链表的当前节点,依次递归下一个节点。
依次返回合并链表的当前节点。
解法二 运行时间:31ms 占用内存:629k
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1==null) return list2;
if(list2==null) return list1;
ListNode mList=new ListNode(0);
ListNode point =mList;
while(list1!=null && list2!=null){
if(list1.val<=list2.val){
point.next=list1;
list1=list1.next;
}else{
point.next = list2;
list2=list2.next;
}
point = point.next;
}
if(list1==null){
point.next=list2;
}else{
point.next=list1;
}
return mList.next;
}
}
①首先,判断链表是否为空,如果其中一个为空就直接返回另一个链表。
②申明合并链表的头结点和指针节点
③循环比较两个链表的头结点的值,让当前的point节点指向值较小的那个节点,该节点等于其下一个节点,同时point向后移。
④判别循环后,如果有链表没遍历完,直接加在point后面
⑤返回头结点的下一个节点(头结点是新建的节点)
这个思想很简单:就是新建一个头结点,依次比较两个链表的节点的值,用next指针把他们依次串联起来。
时间: 2024-11-02 04:35:45