题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:1、先判断两个链表是否为空,一个为空,就直接返回另一个。然后定义两个不同节点,同时指向两个链表中最小值。保证一个头指针不动,另一个根据两链表最小值而动。直到一个链表为空,则直接将另一个链表接在后面。因为有一个静止头结点始终指向新建链表的头结点,返回它即可。
2、两个链表都是排序好的,我们只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针即可。使用递归就可以轻松实现。
思路1代码;
public static ListNode Merge(ListNode list1, ListNode list2) {
if(list1==null)
return list2;
if(list2==null)
return list1;
ListNode head = new ListNode(0);
ListNode stay_head = new ListNode(0);
if(list1.val<=list2.val) {
head.val = list1.val;
list1 = list1.next;
}
else {
head.val = list2.val;
list2 = list2.next;
}
stay_head = head;
while((list1!=null)&&(list2!=null)) {
if(list1.val<list2.val) {
ListNode node = new ListNode(0);
node.val = list1.val;
head.next = node;
// node.next = head; 逆序
head = node;
list1 = list1.next;
}
else if(list1.val>list2.val) {
ListNode node = new ListNode(0);
node.val = list2.val;
head.next = node;
head = node;
list2 = list2.next;
}
else {
ListNode node1 = new ListNode(0);
ListNode node2 = new ListNode(0);
node1.val = list1.val;
head.next = node1;
head = node1;
list1 = list1.next;
node2.val = list2.val;
head.next = node2;
head = node2;
list2 = list2.next;
}
}
while(list1!=null) {
ListNode node = new ListNode(0);
node.val = list1.val;
head.next = node;
head = node;
list1 = list1.next;
}
while(list2!=null) {
ListNode node = new ListNode(0);
node.val = list2.val;
head.next = node;
head = node;
list2 = list2.next;
}
return stay_head;
}
思路2代码:
public static ListNode Merge1(ListNode list1, ListNode list2) {
if(list1==null)
return list2;
if(list2==null)
return list1;
ListNode head = new ListNode(0);
if(list1.val<list2.val) {
head = list1;
head.next = Merge1(list1.next, list2);
}
else {
head = list2;
head.next = Merge1(list2.next, list1);
}
return head;
}