您的位置:首页 > 其它

LintCode 合并两个排序链表

2017-08-28 10:19 211 查看

题目

将两个排序链表合并为一个新的排序链表

样例
给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null。


//Definition for ListNode.
public class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}


思路

如果两个链表任一为空,则返回另一个。如果都为空,直接返回空。

定义一个新链表,用于存储合并后的链表。

比较两个链表,把其中链表值较小的存入新链表中,链表后移。

如果其中一个链表已经移到到链表末尾,则将另一个链表剩余的部分直接存储到新链表。

返回新链表。

因为本题没有时间与空间限制,所以递归与非递归都可以顺利通过。

递归实现

//递归
public ListNode mergeTwoLists1(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
//新链表,记录合并
ListNode node = null;
//比较链表值
if (l1.val < l2.val) {
//存储较小的
node = l1;
//递归,移动指针
node.next = mergeTwoLists(l1.next, l2);
} else {
//存储较小的
node = l2;
//递归,移动指针
node.next = mergeTwoLists(l1, l2.next);
}
return node;
}


非递归

//非递归,占用内存小
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
//记录合并链表,初始化
ListNode newNode = new ListNode(-1);
//合并链表的指针
ListNode node = newNode;
while (l1 != null && l2 != null) {
//比较链表值,存储较小的,然后移动指针
if (l1.val < l2.val) {
node.next = l1;
l1 = l1.next;
} else {
node.next = l2;
l2 = l2.next;
}
// 将指针移动到合并后链表的结尾
node = node.next;
}
// 如果第一个链表的元素未处理完,将其接到合并链表的最后一个结点之后
if (l1 != null) {
node.next = l1;
}
// 如果第二个链表的元素未处理完,将其接到合并链表的最后一个结点之后
if (l2 != null) {
node.next = l2;
}
return newNode.next;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: