问题描述:
Merge two sorted linked lists and return it as a sorted list. The list should be made by splicing together the nodes of the first two lists.
顺序合并两个(有序)单链表
思路:
思路简单暴力,先把临界情况排除,剩下两个链表均至少有一个节点的情况。再把两个链表尾巴补上大数节点,省下检查尾部空指针的情况。比较时每个链表分派一个指针,较小者胜出,补进新链表。在新链表中保留并实时更新当前位置的指针,知道两个链表均比较至末尾。返回头指针。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if ((l1==null) && (l2==null)) return null;
if ((l1!=null) && (l2==null)) return l1;
if ((l1==null) && (l2!=null)) return l2;
//add a dummy node at back of list1
ListNode iter = l1;
while (iter.next!=null){
iter = iter.next;
}
ListNode dummy1 = new ListNode (999);
iter.next = dummy1;
dummy1.next = null;
//add a dummy node at back of list2
iter = l2;
while (iter.next!=null){
iter = iter.next;
}
ListNode dummy2 = new ListNode(999);
iter.next = dummy2;
dummy2.next = null;
//sorting
ListNode head = null;
ListNode pointer1 = l1;
ListNode pointer2 = l2;
if (pointer1.val<=pointer2.val){
head = new ListNode(pointer1.val);
pointer1=pointer1.next;
}
else{
head = new ListNode(pointer2.val);
pointer2=pointer2.next;
}
ListNode recent_add = head;
ListNode to_add = null;
while((pointer1.val!=999)||(pointer2.val!=999)){
if (pointer1.val<=pointer2.val){
to_add = new ListNode(pointer1.val);
pointer1=pointer1.next;
}
else{
to_add = new ListNode(pointer2.val);
pointer2=pointer2.next;
}
recent_add.next = to_add;
recent_add = to_add;
}
return head;
}
}
代码不复杂,但是太长了。。。有必要学习一下简便的方法。
简便方法1:递归
class Solution {
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;
}
}
}