您的位置:首页 > 其它

合并两个排序的链表

2016-03-19 15:44 429 查看
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路:题目相对简单,有两个思路,一个是遍历两个链表的公共长度,按值的大小把各个节点连接起来,最后把较长链表的剩余部分追加到最后。第二个思路,这个类似于自然合并排序,可以使用递归分治的思想来解决问题,还让你容易就能把这个问题分解成子问题。

实现代码

非递归:

/*
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;

ListNode head;
if(list1.val<=list2.val) {
head = list1;
list1 = list1.next;
}
else {
head = list2;
list2 = list2.next;
}

ListNode pNode = head;

while(list1 != null && list2 != null) {
if(list1.val <= list2.val) {
pNode.next = list1;
list1 = list1.next;
}
else {
pNode.next = list2;
list2 = list2.next;
}
pNode = pNode.next;
}

while(list1 != null) {
pNode.next = list1;
pNode = pNode.next;
list1 = list1.next;
}

while(list2 != null) {
pNode.next = list2;
pNode = pNode.next;
list2 = list2.next;
}

return head;
}
}


递归:

/*
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;

ListNode head;

if(list1.val < list2.val) {
head = list1;
head.next = Merge(list1.next, list2);
}
else {
head = list2;
head.next = Merge(list1, list2.next);
}
return head;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: