Merge Two Sorted Lists 链表合并问题
题目
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
Example:
Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4
(源于Leetcode 第21 题)
给出的数据结构
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
解析
本题本质上就是链表合并问题。而且本题提供的是已经有序的单链表,所以不用进行预先操作。下面提供两种解法
解法一
可以使用最普通的解法,就变将两个链表的的元素一一对比进行合并,为此我们需要设置两个遍历指针,一边对比一遍遍历。当两个链表长度不一致的时候,遍历完后将剩余的链表放置到目标链表的后面即可。时间复杂度为O(2n)
下面提供java代码:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//若其中一个链表为空,直接返回另外一个
if(l1 == null){
return l2;
}
if (l2 == null){
return l1;
}
//p1,p2分别为l1,l2的遍历指针,l3为目标链表
ListNode p1 = l1;
ListNode p2 = l2;
ListNode l3 = null;
//l3的初始化,取两个链表的最小头
if(p1.val <= p2.val){
l3 = p1;
p1 = p1.next;
}else{
l3 = p2;
p2 = p2.next;
}
//p3为l3的遍历指针
ListNode p3 = l3;
//逐个对比
while(p1 != null && p2 != null){
if(p1.val <= p2.val){
p3.next = p1;
p3 = p3.next;
p1 = p1.next;
} else{
p3.next = p2;
p3 = p3.next;
p2 = p2.next;
}
}
if(p1 != null){
p3.next = p1;
}
if(p2 != null){
p3.next = p2;
}
return l3;
}
}
解法二
我们可以使用递归算法来完成。假设长为m,n的链表,若m头结点的值比n头结点的值要下,则接下来就是对比链表m.next和n了。反之毅然。
下面提供java代码
public ListNode mergeTwoLists(ListNode l1, ListNode l2){
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.val < l2.val){
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else{
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}